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

前言 

 

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

本教程将会通过案例的方式,快速掌握如何使用Java8的Lamdba写出简洁高效的代码。现在语言发展极快,语言大多面临“要么改变,要么衰亡”的压力,因此我们也需要与时俱进写出更优雅更满足现在开发需求的代码。

目录

  •  方法引用 

  •  行为参数化 

  •  谓词

  •  函数式接口

  •  Lambda表达式 

     

 掌握方法引用 :: 

我们完成第一个小案例:找出硬盘中所有的隐藏文件。

  e338f33e75fb44138f4a05c390602d06.png

47ffb68319674cdf90de862e5547ad2e.png

如果在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的公共类:

b7711a66bc2743568330393f36bddac7.png

5b86f60adab14e56983c5363698627a2.png

 

用户第一个需求:查出全部的男性征婚者;

增加一个LoverUtil.java来实现这个功能:

68b0520106f94a0da35f751bfc52d783.png

用户第二个需求:查出全部的女性征婚者

在LoverUtil.java中增加一个findAllByCretira方法来实现这个功能:

6f7e92e845744852bd5e4251c5420cd5.png

 

用户第三个需求:查出全部的中年油腻征婚者(识别潜在条件age>15为中年油腻者)

在LoverUtil.java中增加一个新的findAllByCretira方法来实现这个功能:

27d793815f014dbd9138631792afc3b3.png

随着需求的不停改变,你会发现代码糟糕透了,而且还不能很好地应对后续的变化需求,比如客户还要求你对应聘者的身高、体重、职业、发型等等方面过滤,你会发现要么你加越来越多的方法,要么是一个非常巨大非常复杂(一堆ifelse)的方法。

你现在需要一种更好的方式,比添加更多参数更好的方式来应对变化。

行为参数化来解决上面的问题

首先我们需要理解理解两个概念:行为参数化和谓词。

 

1. 行为参数化就是把代码传递给方法。

2. 谓词就是接收一个参数值,并返回true或false的函数。

Java8新增的一个接口Predicate:Determines if the input object matches some criteria。

 Predicate< T>接口接受一个T类型参数,返回一个boolean值,可知Predicate就是

一个谓词。

下面我们来看一下应用上面Java8的谓词来修改的代码,在LoverUtil.java中增加一个新的findLovers方法来实现这个功能::

bbec2dd6679949dcb3a7c37bd7e73cfc.png

这里使用了谓词和方法引用使代码看起易读了很多,现在我们继续引入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表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例

代码改写:

97a057bac3a746f082e98c60b04c19e8.png

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

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

d71715f12e3b44d4a26b241b43139acb.png

a32772fa48bf4db5a743811bfa74b9d4.png

知识点总结:

 

  • 方法引用:掌握 :: 语法

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

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

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

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

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

 

最后

添加Jessica小仙女VX:  Sxbang6v6  !

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值