我希望能够在流的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)))
然而,它们都给我报了“非静态方法无法从静态上下文中引用”的错误。
A :: getProperty2
可能是任何一个功能接口,它具有一个返回java.util.function.Function
的andThen
方法,而Java无法为您推断出它的类型。 - Louis Wasserman