lambda表达式函数接口
Java 8 Lambda表达式的实现需要介绍一些具有深奥名称的新接口,这些接口可能会对没有任何函数式编程经验的开发人员造成一定的威胁。 功能性UnaryOperator接口就是这样的领域。
它可能在学术上被命名,但是就其目的和实现而言却非常简单。
一元运算符的功能
UnaryOperator接口的功能是获取一个对象,对其执行某些操作,然后返回相同类型的对象。 这就是函数的一元性质。 一种对象类型进入,而完全相同的类型消失。
有关更多技术讨论,您可以从UnaryOperator JavaDoc中看到该组件扩展了Function接口并定义了一个名为apply的方法。
java.util.function.UnaryOperator
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T,T>
T apply(T t)
Applies this function to the given argument.
Parameter Types:
T - the input given to the function
T - the result running the function
例如,也许您想从String中去除所有非数字字符。 在这种情况下,将包含一串数字和字母的字符串放入UnaryOperator,然后返回仅包含数字的字符串。 一个字符串进入,一个字符串出来。 那是一个运行中的UnaryOperator。
一元的定义。
UnaryOperator示例的实现
为了向您展示一个古老的Java 8 UnaryOperator示例,我们将创建一个名为UnaryOperatorExample的类,并提供所需的apply方法。 apply方法是实现UnaryOperator接口的所有类所需的单个方法。
我们将在类声明<String>中使用泛型,以指示此UnaryOpeartor的apply方法仅适用于String对象 ,但该UnaryOperator接口当然不仅限于基于文本的数据。 您可以使用任何有效的Java类来通用该接口。
package com.mcnz.lambda;
import java.util.function.UnaryOperator;
// Create class that implements the UnaryOperator interface
public class UnaryOperatorExample implements UnaryOperator<String>{
public String apply(String text) {
return text+".txt";
}
}
class UnaryOperatorTest {
public static void main(String args[]){
UnaryOperatorExample uoe = new UnaryOperatorExample();
String text = "lambda-tutorial";
String newText = uoe.apply(text);
System.out.println(newText);
}
}
执行该类时,结果是将文本字符串lambda-tutorial.txt写入控制台。
UnaryOperator Lambda表达式示例
如果您使用完整的Java类实现UnaryOperator接口,它将创建完全有效的代码,但无法实现使用功能接口的目的。 函数式编程的全部思想是编写使用非常稀疏和简洁的lambda表达式的代码。 使用lambda表达式 ,我们可以完全消除对UnaryOperatorExample类的需要,并这样重写整个应用程序:
package com.mcnz.lambda;
import java.util.function.UnaryOperator;
// A UnaryOperator Lambda expression example
class UnaryOperatorTest {
public static void main(String args[]){
UnaryOperator<String> extensionAdder = (String text) -> { return text + ".txt";} ;
String newText = extensionAdder.apply("example-function");
System.out.println(newText);
}
}
lambda表达式框架的目标之一是简化Java语言并从代码中消除尽可能多的仪式 。 这样,发现我们可以通过重写突出显示的代码行来进一步简化lambda表达式就不足为奇了:
UnaryOperator<String> extensionAdder = (text) -> text + ".txt" ;
Java API对UnaryOperator函数的使用
现在,功能已紧密地嵌入到整个Java API中,诸如上述的Consumer接口和当前的UnaryOperator之类的接口倾向于在任何地方弹出。 它最著名的用法之一是Stream类的迭代方法的参数。
static <T>Stream <T> iterate(T seed, UnaryOperator<T> f)
对于初学者来说,这样的方法签名可能会令人生畏,但是正如这个UnaryOperator示例所演示的那样,仅接收并返回相同数据类型的对象的lambda表达式的实现确实不容易。 这就是lambda项目背后的全部思想-最终,Java程序将更易于阅读和编写 。
lambda表达式函数接口