【发布时间】:2015-03-12 16:36:43
【问题描述】:
用例
我目前在许多适配器中都有这种模式:
entries.stream()
.filter(Entry.class::isInstance)
.map(Entry.class::cast)
.map(Entry::getFooBar)
.collect(Collectors.toList());
entrys 是实现特定接口的对象的List。不幸的是,接口 - 它是 3rd 方库的一部分 - 没有定义常见的 getter。要创建我想要的对象列表,我需要搜索它们、强制转换它们并调用适当的 getter 方法。
我打算将它重构为一个辅助类:
public static <T, O> List<O> entriesToBeans(List<T> entries,
Class<T> entryClass, Supplier<O> supplier) {
return entries.stream()
.filter(entryClass::isInstance)
.map(entryClass::cast)
.map(supplier) // <- This line is invalid
.collect(Collectors.toList());
}
然后我会调用这个方法来进行转换:
Helper.entriesToBeans(entries,
Entry_7Bean.class,
Entry_7Bean::getFooBar);
不幸的是,我无法将 getter 传递给重构函数并让 map 调用它,因为 map 需要一个函数。
问题
- 如何在重构版本中调用 getter?
【问题讨论】:
-
当源是
List<T>而entryClass是Class<T>时,为什么要执行.filter(entryClass::isInstance).map(entryClass::cast),换句话说,源已经保证只包含正确键入的项目? -
@Holger 使用
List<? super T>可能更有意义 -
@assylias: 只是
List<?>因为无论如何都与<T>没有关系。 -
@Holger 是的 - 你又是对的! ;-)
标签: java java-8 java-stream