起因是这样的,学习函数式编程的时候学到了Function接口,对于其中的apply方法感到不解,下面贴上我的不解代码
在这里插public class Function接口 {
public static void main(String[] args) {
String s="1234";
method(s,(String a)->{
**return Integer.parseInt(a);**
});
}
public static void method(String s, Function<String,Integer> fun){
**Integer i = fun.apply(s);**
System.out.println(i);
}
}
其中这两处代码是我感到最疑惑的地方,最开始我对apply方法的解释理解错误,可能也是因为看到Function接口中的两个泛型,误以为这个可以对数据的类型进行转换,明明"return Integer.parselnt(a);"代码中就已经将String类型的a转换为了整形的Integer,下面的"Integer i=fun.apply(s)"那不是多余的吗?
哪知道这个apply方法只是简单地对转换过的数据进行传递而已
下面就是我从别处收集过来的资料
Java Function接口非常简单。它将单个Java对象作为参数,并在方法结束时返回单个Java对象。您可以想出的任何方法都会获取一个对象并返回一个满足Java函数契约的对象。
如何使用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));
运行上面的代码时,输出将是四
Java Function接口示例
类似地,我们可以编写一个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.当然,这个实现也非常冗长。使用Java lambda表达式时,左侧不需要对象类型,如果lambda表达式是一行长,则可以省略括号和return关键字。因此,实现此Java Function接口的更简洁的lambda表达式如下所示:
在这里插入代码Function<Integer, String> conciseLambda = (Integer x)-> { return Integer.toString(x*x); };
System.out.println(conciseLambda.apply(5));
当代码实现Java函数并运行简洁的lambda表达式时,程序将打印出25。
这就是你真正需要了解的java.util.function.Function接口。它是一个非常简单的组件,只需要实现一个名为apply的方法 - 在单个对象中传递,运行完成并返回另一个Java对象。就是这么简单。
不要过度复杂Java的Function接口
有些人会发现Java Function接口的简单性有点令人困惑。毕竟,一种输入某个东西并返回其他东西的方法似乎是如此令人难以置信的模糊和抽象,几乎看起来毫无意义。
然而,经验丰富的Java开发人员知道,有时最简单的语言结构可能会变得最强大,就像使用抽象类和接口设计的对象模型一样。当涉及到java.util.function包中列出的各种组件时,通过简单性的功能正是如此。