Java 函数式接口中的 Lambda

Lambdas in FunctionalInterfaces in Java

我正在尝试在 Java 中使用 lambda,但完全不明白它是如何工作的。我这样创建 @FunctionalInterface

@FunctionalInterface
public interface MyFunctionalInterface {
    String getString(String s);
}

现在在我的代码中我使用 lambda 如下:

MyFunctionalInterface function = (f) -> {
    Date d = new Date();
    return d.toString() + " " + person.name + " used fnc str";
};

接下来,我想利用我的 function 将其传递给另一个 class 的构造函数并像这样使用它:

public SampleClass(MyFunctionalInterface function) {
    String tmp = "The person info: %s";
    this.result = String.format(tmp, function.getString(String.valueOf(function)));
}

为什么我需要在这里使用它valueOf()?我以为感谢这个我可以只使用 function.getString()?

输出: Tue Sep 19 11:04:48 CEST 2017 John used fnc str

您的 getString 方法需要一个 String 参数,因此您不能在没有任何参数的情况下调用它。

也就是说,您的 lambda 表达式会忽略 String 参数,而是从某个 person 变量(您没有在声明它的地方显示)获取数据。

也许您的功能接口应该采用 Person 参数:

@FunctionalInterface
public interface MyFunctionalInterface {
    String getString(Person p);
}

MyFunctionalInterface function = p -> {
    Date d = new Date();
    return d.toString() + " " + p.name + " used fnc str";
};

public SampleClass(MyFunctionalInterface function, Person person) {
    String tmp = "The person info: %s";
    this.result = String.format(tmp, function.getString(person));
}

或者,您可以从函数式接口的方法中删除参数:

@FunctionalInterface
public interface MyFunctionalInterface {
    String getString();
}

MyFunctionalInterface function = () -> {
    Date d = new Date();
    return d.toString() + " " + person.name + " used fnc str";
};

public SampleClass(MyFunctionalInterface function) {
    String tmp = "The person info: %s";
    this.result = String.format(tmp, function.getString());
}