我想使用基于另一个方法引用的方法引用。这很难解释,所以我给你举个例子:
Person.java
putRoot
鉴于mapRoot
的列表,我想使用方法引用来获取其兄弟年龄的列表。我知道这可以这样做:
public class Person{
Person sibling;
int age;
public Person(int age){
this.age = age;
}
public void setSibling(Person p){
this.sibling = p;
}
public Person getSibling(){
return sibling;
}
public int getAge(){
return age;
}
}
但我想知道是否可以这样做:
Person
在这个例子中它并不是非常有用,我只是想知道可能的事情。
答案 0 :(得分:13)
在这种情况下,您需要使用两个map
操作:
roster.stream().map(Person::getSibling).map(Person::getAge).collect(Collectors.toList());
第一个将Person
映射到其兄弟,第二个将Person
映射到其年龄。
答案 1 :(得分:2)
您可以使用Eclipse Collections中的Functions.chain()
来链接方法引用:
MutableList<Person> roster = Lists.mutable.empty();
MutableList<Integer> ages =
roster.collect(Functions.chain(Person::getSibling, Person::getAge));
如果您无法从List
List<Person> roster = Lists.mutable.empty();
List<Integer> ages =
ListAdapter.adapt(roster).collect(Functions.chain(Person::getSibling, Person::getAge));
由于年龄为int
,您可以使用IntList来避免拳击:
MutableList<Person> roster = Lists.mutable.empty();
IntList ages = roster.collectInt(Functions.chainInt(Person::getSibling, Person::getAge));
注意:我是Eclipse Collections的撰稿人。
答案 2 :(得分:1)
使用Function.andThen,并可能在调用中包装您的第一个方法引用,或者转换。
public static <V, R> Function<V,R> ofFunction(Function<V,R> function) {
return function;
}
roster.collect(ofFunction(Person::getSibling).andThen(Person::getAge));