如何在java 8流中将参数化的getter称为映射器?
发布时间:2020-12-15 04:26:02 所属栏目:Java 来源:网络整理
导读:用例 我目前在许多适配器中都有这种模式: entries.stream() .filter(Entry.class::isInstance) .map(Entry.class::cast) .map(Entry::getFooBar) .collect(Collectors.toList()); 条目是实现特定接口的对象列表.不幸的是,界面 – 它是第三方库的一部分 –
用例
我目前在许多适配器中都有这种模式: entries.stream() .filter(Entry.class::isInstance) .map(Entry.class::cast) .map(Entry::getFooBar) .collect(Collectors.toList()); 条目是实现特定接口的对象列表.不幸的是,界面 – 它是第三方库的一部分 – 没有定义常见的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传递给重构函数并让地图调用它,因为地图需要一个函数. 题 >如何在重构版本中调用getter? 解决方法
像这样的方法:
class T { public O get() { return new O(); } } 将映射到函数< T,O>. 因此,您只需将方法签名更改为: public static <T,Function<T,O> converter) { 更新:我怀疑,投射的原因是你的原始列表可能包含不是Ts的元素.所以你也可以将签名更改为: public static <T,O> List<O> entriesToBeans(List<?> entries,O> converter) { 然后,您可以传递List< Object>,例如,只保留列表中的Ts,转换和转换. 作为参考,这是一个工作示例(打印John,Fred): static class Person { private final String name; Person(String name) { this.name = name; } String name() { return name; } } public static void main(String[] args) { List<String> result = entriesToBeans(Arrays.asList(new Person("John"),new Person("Fred")),Person.class,Person::name); System.out.println("result = " + result); } public static <T,O> converter) { return entries.stream() .filter(entryClass::isInstance) .map(entryClass::cast) .map(converter) .collect(Collectors.toList()); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |