我有一个对象 ( Adult) 和另一个对象 ( Child) 作为参数。我正在尝试写一个Function如果给成人则返回孩子的名字。
我写了这个:
public static void main(String[] args) {
Function<Adult, Object> adult_name_f = Adult::getName;
Function<Adult, Object> adult_child_f = Adult::getChild;
Function<Adult, Object> child_name_f = Adult::getChild.getName;
}
static class Adult {
String name;
Child child;
public Child getChild() {
return child;
}
public String getName() {
return name;
}
}
static class Child {
String name;
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
但(显然)Adult::getChild.getName不是有效的Function.
如果把孩子的名字交给大人,有没有办法归还孩子的名字?
首先,您应该指定适当的返回类型Function。
Function<Adult, String> adult_name_f = Adult::getName;
Function<Adult, Child> adult_child_f = Adult::getChild;
Run Code Online (Sandbox Code Playgroud)
然后您可以使用该Function.andThen()方法创建第三个Function.
Function<Adult, String> child_name_f = adult_child_f.andThen(Child::getName);
Run Code Online (Sandbox Code Playgroud)
或者,更常见的是,要创建方法链,您可以Function使用 lambda 表达式来定义。您甚至可以对前两个使用 lambda 表达式,但方法引用更好(生成的代码更少)。
Function<Adult, String> adult_name_f = a -> a.getName();
Function<Adult, Child> adult_child_f = a -> a.getChild();
Function<Adult, String> child_name_f = a -> a.getChild().getName();
Run Code Online (Sandbox Code Playgroud)
测试
Adult mary = new Adult("Mary", new Child("Jesus"));
System.out.println(adult_name_f.apply(mary)); // prints: Mary
System.out.println(adult_child_f.apply(mary)); // prints: Test$Child@XXXXXXXX
System.out.println(child_name_f.apply(mary)); // prints: Jesus
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |