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

前言

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

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

行为参数化

谓词

函数式接口

Lambda表达式

掌握方法引用 ::

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

package com.sxbang.task1;

import java.io.File;

import java.io.FileFilter;

public class FIndHiddenMovie {

//找出硬盘中所有隐藏文件

public static void main(String[] args) {

//传统写法

File[] files = new File(".").listFiles(new FileFilter() {

@Override

public boolean accept(File pathname) {

return pathname.isHidden();

}

});

for(File file : files) {

System.out.println(file.getName());

}

}

}

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

211836b977e39f910575d75136e7002d.png

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

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

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

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

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

在LoverUtil.java中增加一个新的findAllByCretira方法来实现这个功能:ce8b2f93b0aa4b8c6b23a20dfa84c3de.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方法来实现这个功能::3d6d3467395532d7015461be4e8542f7.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接口吗?它就是哈

问:Why?

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

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

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

代码改写:b262ced13754195c77fb92f374b5a3cd.png

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

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

public static List filter(List list, Predicate p){

List result = new ArrayList();

for(T e : list){

if(p.test(e))

result.add(e);

}

return result;

在app.java中进行测试实现

//更抽象化更普适化的实现

List OMen = CommonUtil.filter(datas, (Lover lover) -> "man".equals(lover.getSex()));

System.out.println(OMen);

知识点总结:方法引用:掌握 :: 语法

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

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

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

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值