我想在流的 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::getProperty2
是 Function<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/