如果您想掌握函数式编程,最好的起点是Java Function接口。 本示例将向您展示四种在代码中实现此功能接口的方法-从如何使用实际类以及如何使用lambda函数创建非常简洁的代码开始。
Java Function接口非常简单。 它使用单个Java对象作为参数,并在方法结束时返回单个Java对象。 您可以想到的任何方法都需要一个对象并返回一个满足Java Function约定的对象。
如何使用Java的Function接口
对于此Java Function接口示例,我们将提供一个名为“ apply”的方法,该方法将Integer作为参数,对其进行平方并以String的形式返回结果。 在开始之前,让我们快速看一下java.util.function.Function的官方JavaDoc:
java.util.function.Function Java Interface Function<T,R> Parameter Types: T - the input given to the function R - the result running the function Popular Subinterface of Function: UnaryOperator<T>
JavaDoc还指示Function接口有一个名为apply的非默认方法,该方法接受一个参数并返回一个参数:
R apply(T t)
人们经常会误认为java.util.functions包中定义的接口有些神奇,但事实并非如此。 它们只是普通的接口,因此,我们总是可以创建一个显式实现它们的类。
class FunctionClass implements Function<Integer, String> {
public String apply(Integer t) {
return Integer. toString (t*t);
}
}
此处定义的FunctionClass实现Function并提供apply方法的实现。 然后,我们可以在具有标准语法规则的任何类中使用它。
Function<Integer, String> functionClass =new FunctionClass();
System. out .println(functionClass.apply(2));
当您运行上面的代码时,输出将为4.
Java函数接口示例
类似地,我们可以编写一个Java函数示例,该示例使用一个内部类来实现apply方法:
Function<Integer, String> innerClass =new Function<Integer, String>(){
public String apply(Integer t) {
return Integer. toString (t*t);
}
};
System. out .println(innerClass.apply(3));
当您运行内部类示例时,输出将为9.
Java的Function和lambda表达式示例
当然,功能接口的整体思想是将lambda表达式合并到混合中。 这是用相当冗长的lambda表达式实现的Java Function示例:
Function<Integer, String> verboseLambda = (Integer x)-> {return Integer. toString (x*x); };
System. out .println(verboseLambda.apply(5));
此实现将打印出值25.当然,此实现也很罗word。 使用Java lambda表达式时 ,不需要在左侧使用对象类型,并且如果lambda表达式为一行,则括号和return关键字都可以省略。 因此,实现此Java Function接口的更简洁的lambda表达式如下所示:
Function<Integer, String> conciseLambda = (Integer x)-> {return Integer. toString (x*x); };
System. out .println(conciseLambda.apply(5));
当代码通过运行简洁的lambda表达式实现Java Function时,程序将输出25.
这就是您真正需要了解的有关java.util.function.Function接口的全部信息。 这是一个非常简单的组件,只需要实现一个方法(称为apply)的实现,该方法就传递到单个对象中,运行到完成并返回另一个Java对象。 就这么简单。
不要使Java的Function接口过于复杂
有些人会发现Java Function接口的简单性有些令人困惑。 毕竟,采用某种方法并返回其他方法的方法似乎是如此的模糊和抽象,几乎没有意义。
但是,经验丰富的Java开发人员知道,有时最简单的语言构造可能会变得最强大,就像使用抽象类和接口设计的对象模型一样。 当涉及到java.util.function包中列出的各种组件时,通过简单性提供强大的支持就非常重要。
您将在很多地方遇到Function接口,尤其是当您使用Java Streams API开始高级功能编程时。 强大的方法,例如map ,reduce和flatMap都将Java Function作为参数。 因此,如果您计划使用Java进行任何map-reduce编程,Functions将成为您最大的朋友之一。