2天吃透Java8-复盘大厂5轮面试之Lambda实战教程

前言 

程序员如何写出艺术?如何用更少时间,写更简洁代码? 

本教程将会通过案例的方式,快速掌握如何使用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接口吗?它就是哈

问:Why?

答:因为Predicate仅仅 定义了一个抽象方法

问:用函数式接口可以干什么?

 答:Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例

代码改写:

引入泛型更抽象更普遍的实现:

新增加一个CommonUtol.java类,实现下面方法: 

知识点总结:

方法引用:掌握 :: 语法

行为参数化:把代码传递给方法

谓词:接收一个参数值,并返回true或false的函数。

Lambda表达式:(parameters)-> expression  或 (parameters)-> { statements; }

函数式接口:接口中只有一个抽象方法

练习巩固1的答案:d、f

最后

添加Jessica小仙女VX:  Sxbang6v6  !

可以获得2天吃透Java8-复盘大厂5轮面试训练营的免费报名资格,

以及更多关于Java全栈的干货以及学习路径。

你可能感兴趣的:(2天吃透Java8-复盘大厂5轮面试之Lambda实战教程)