从 lambda 函数的结果调用方法

ryv*_*age 3 java lambda

我有一个对象 ( 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.

如果把孩子的名字交给大人,有没有办法归还孩子的名字?

And*_*eas 5

首先,您应该指定适当的返回类型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)