前言
程序员如何写出艺术?如何用更少时间,写更简洁代码?
本教程将会通过案例的方式,快速掌握如何使用Java8的Lamdba写出简洁高效的代码。现在语言发展极快,语言大多面临“要么改变,要么衰亡”的压力,因此我们也需要与时俱进写出更优雅更满足现在开发需求的代码。
目录
方法引用
行为参数化
谓词
函数式接口
Lambda表达式
掌握方法引用 ::
我们完成第一个小案例:找出硬盘中所有的隐藏文件。
如果在Java8里,我们可以如何编码?
//使用java8的方法引用 :: 语法
File[] newfiles = new File(".").listFiles(File::isHidden);
这里首先我们需要有个思想转变,我们知道编程语言的整个目的就在于操作值,比如int、 String、对象,我们可以把这些值进行传递,例如add(int a)。在Java8以前,方法是不能传递,例如add(getValue()),但是人们发现在运行时传递方法能让编程更轻松。
在Java 8里只需用Java 8的方法引用::语法,写下File::isHidden的时候,你就创建了一个方法引用,将其传给listFiles方法。
这时候你会发现这样写的好处是,你的代码现在读起来更接近问题的陈述了,把方法作为值来传递显然很有用。
Lambda应用
我们开始我们的第二个案例:婚介系统的需求,在开始之前,我们先准备一个Lover.java的公共类:
用户第一个需求:查出全部的男性征婚者;
增加一个LoverUtil.java来实现这个功能:
用户第二个需求:查出全部的女性征婚者
在LoverUtil.java中增加一个findAllByCretira方法来实现这个功能:
用户第三个需求:查出全部的中年油腻征婚者(识别潜在条件age>15为中年油腻者)
在LoverUtil.java中增加一个新的findAllByCretira方法来实现这个功能:
随着需求的不停改变,你会发现代码糟糕透了,而且还不能很好地应对后续的变化需求,比如客户还要求你对应聘者的身高、体重、职业、发型等等方面过滤,你会发现要么你加越来越多的方法,要么是一个非常巨大非常复杂(一堆ifelse)的方法。
你现在需要一种更好的方式,比添加更多参数更好的方式来应对变化。
行为参数化来解决上面的问题
首先我们需要理解理解两个概念:行为参数化和谓词。
1. 行为参数化就是把代码传递给方法。
2. 谓词就是接收一个参数值,并返回true或false的函数。
Java8新增的一个接口Predicate:Determines if the input object matches some criteria。
Predicate< T>接口接受一个T类型参数,返回一个boolean值,可知Predicate就是
一个谓词。
下面我们来看一下应用上面Java8的谓词来修改的代码,在LoverUtil.java中增加一个新的findLovers方法来实现这个功能::
这里使用了谓词和方法引用使代码看起易读了很多,现在我们继续引入Lambda表达式更进一步简化我们的代码。
Lambda表达式
1.Lambda表达式的语法:
(parameters)-> expression 或 (parameters)-> { statements; }哪个不是有效的Lambda表达式?
a. ()->{}
b. ()->"Alex"
c. ()->{ return "alex";}
d. (String name) -> return "hello" + name;
e. (String name) -> "hello" + name;
f. (String name) -> {"hello" + name;}
答案在最后
2. Lamdba表达式可以用在哪里?
问:了解语法之后,在哪里可以使用Lambda表达式?
答:可以在函数式接口上使用
问:啥是函数式接口?
答:你还记得前面的 Predicate<T>接口吗?它就是哈
问:Why?
答:因为Predicate仅仅 定义了一个抽象方法
问:用函数式接口可以干什么?
答:Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例
代码改写:
引入泛型更抽象更普遍的实现:
新增加一个CommonUtol.java类,实现下面方法:
知识点总结:
方法引用:掌握 :: 语法
行为参数化:把代码传递给方法
谓词:接收一个参数值,并返回true或false的函数。
Lambda表达式:(parameters)-> expression 或 (parameters)-> { statements; }
函数式接口:接口中只有一个抽象方法
练习巩固1的答案:d、f
最后
添加Jessica小仙女VX: Sxbang6v6 !
可以获得2天吃透Java8-复盘大厂5轮面试训练营的免费报名资格,
以及更多关于Java全栈的干货以及学习路径。