java - 如何在 Java 8 流中将参数化的 getter 调用为映射器?

标签 java java-8 java-stream

用例

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

entries.stream()
        .filter(Entry.class::isInstance)
        .map(Entry.class::cast)
        .map(Entry::getFooBar)
        .collect(Collectors.toList());

其中条目是实现特定接口(interface)的对象的列表。不幸的是,该接口(interface)——它是第 3 方库的一部分——没有定义通用的 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?

最佳答案

像这样的方法:

class T {
  public O get() { return new O(); }
}

将映射到 Function<T, O> .

因此您只需将方法签名更改为:

public static <T, O> List<O> entriesToBeans(List<T> entries,
        Class<T> entryClass, Function<T, O> converter) {

更新:我怀疑强制转换的原因是您的原始列表可能包含不是 Ts 的元素。所以你也可以将签名更改为:

public static <T, O> List<O> entriesToBeans(List<?> entries,
        Class<T> entryClass, Function<T, O> converter) {

然后您可以传递 List<Object> ,例如,只保留列表中的 T,转换和转换。


作为引用,这是一个工作示例(打印 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> List<O> entriesToBeans(List<?> entries,
        Class<T> entryClass, Function<T, O> converter) {
  return entries.stream()
          .filter(entryClass::isInstance)
          .map(entryClass::cast)
          .map(converter)
          .collect(Collectors.toList());
}

关于java - 如何在 Java 8 流中将参数化的 getter 调用为映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29015397/

相关文章:

java使用httpclient 4.1抓取https获取bad_record_mac

java - 我可以装饰 Guava 的 Joiner 类吗

java - 如果 HH :mm:ss is not defined?,我如何创建默认的 ZonedDateTime 到午夜

spring-boot - @RepositoryEventHandler 事件以 @RepositoryRestController 停止

java - 在 Java 中是否有一种简单的方法可以使用自定义 equals 函数来获取两个集合之间的差异而不覆盖 equals?

java - JPA 持久性属性干扰 JAXB

java - 哈希机制真的安全吗?

javascript - Java 8 Lambdas 与 JavaScript 中的自执行函数

java - Infinite Java Stream 和 Reactor Flux 的区别

java-8 - 如何使用流将一维整数数组转换为映射