java - 在流收集器中编写 Java 8 方法引用

标签 java java-8 java-stream method-reference collectors

我想在流的 collect(Collectors.toMap(..)) 调用中编写方法引用。在以下示例中,我的代码无需方法引用即可完成我的任务:

class A {
    private String property1;
    private B property2;

    public String getProperty1() { return property1; }
    public B getProperty2() { return property2; }
}

class B {
    private String property3;

    public String getProperty3() { return property3; }
}

public class Main {
    public static void Main() {
        List<A> listOfA = /* get list */;

        Map<String, String> = listOfA.stream()
            .collect(toMap(x -> x.getProperty1(), x -> x.getProperty2().getProperty3()));
    } 
}

x -> x.getProperty1() 更改为 A::getProperty1() 很简单。然而,对于 x -> x.getProperty2().getProperty3() 来说,这并不简单。我想要以下其中一项工作:

.collect(toMap(A::getProperty1, ((Function)A::getProperty2).andThen((Function)B::getProperty3)))

.collect(toMap(A::getProperty1, ((Function)B::getProperty3).compose((Function)A::getProperty2)))

但是,它们都给我错误Non-static method cannot be referenced from static context

最佳答案

A::getProperty2Function<A, B> (这是一个接受 A 实例并返回 B 实例的函数)。

您可以将其转换为:

((Function<A, B>)A::getProperty2).andThen(B::getProperty3)

或者您可以像这样创建一个函数生产者:

public static <A, B, R> Function<A, R> compose(
        Function<A, B> f1, Function<B, R> f2) {
    return f1.andThen(f2);
}

并用它来组成:

compose(A::getProperty2, B::getProperty3)

关于java - 在流收集器中编写 Java 8 方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39841460/

相关文章:

java - 我可以使用任何具有 SkippingCipher 接口(interface)的东西解密 Bouncy CaSTLe 中的 GCM AES 流吗?

java - 构建-impl.xml :1045: Deployment error: Starting of Tomcat failed

java - 如何在 Java Streams 中记录过滤后的值

java - 如何对属于两个或多个组的列表中的对象进行分组?

java,固定最大宽度的多行工具提示,使用html标签

java - 识别谁购买了 PayPal - IPN

java - AWS Lambda - Java 静态初始化

java - 收集以映射已排序流的顺序/位置值

Java 流 |按相同元素分组

java - 在 Java 8 Stream API 中,DirectoryStream<Path> 和 Stream<Path> 之间有什么区别?