如何在java 8流中将参数化的getter称为映射器?

用例

我目前在许多适配器中都有这种模式:

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());
}

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...