关于学习java函数式接⼝Function中的apply⽅法的⼀些感悟
起因是这样的,学习函数式编程的时候学到了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){
学习java的学习方法**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){
String(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){
String(t*t);
}
};
System.out.println(innerClass.apply(3));
运⾏内部类⽰例时,输出将为9。
Java的Function和lambda表达式⽰例
当然,函数接⼝的整个想法是将lambda表达式合并混合其中。这是使⽤相当详细的lambda表达式实现的Java Function⽰例(不需要⾃⼰再编写⼀个实现类了):
在这⾥Function<Integer, String> verboseLambda =(Integer x)->{String(x*x);};
System.out.println(verboseLambda.apply(5));插⼊代码⽚
这个实现将打印出值25.当然,这个实现也⾮常冗长。使⽤Java lambda表达式时,左侧不需要对象类型,如果lambda表达式是⼀⾏长,则可以省略括号和return关键字。因此,实现此Java Function接⼝的更简洁的lambda表达式如下所⽰:
在这⾥插⼊代码Function<Integer, String> conciseLambda =(Integer x)->{String(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包中列出的各种组件时,通过简单性的功能正是如此。
参考⽂章:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论