我们都是阴沟里的虫子,但总还是得有人仰望星空。——《三体》

在之前的文章中介绍了Lambda表达式的基本语法正确使用姿势,这次我来介绍一些Lambda更简洁的用法。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

类型推断

编译器可以通过函数式接口推断出Lambda表达式的参数类型,所以在编写Lambda表达式时,可以省略参数类型。比如:

Comparator<Mask> comparator = (Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand());

就可以简写为:

Comparator<Mask> comparator = (o1, o2) -> o1.getBrand().compareTo(o2.getBrand());

另外,当Lambda表达式只有一个参数的时候,不仅可以省略参数类型,还可以省略到参数名称两边的括号,比如:

Predicate<Mask> predicate = (Mask mask) -> mask.getType() == "N95";

就可以简写为:

Predicate<Mask> predicate = mask -> mask.getType() == "N95";

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

方法引用

什么是方法引用?

方法引用是Java8中引入的新特性,它提供了一种引用方法而不执行方法的方式,可以让我们重复使用现用方法的定义,做为某些Lambda表达式的另一种更简洁的写法。

比如前面的例子:

Comparator<Mask> comparator = (o1, o2) -> o1.getBrand().compareTo(o2.getBrand());

使用方法引用以后,可以简写为:

Comparator<Mask> comparator = Comparator.comparing(Mask::getBrand);

当你需要方法引用时,目标引用放在分隔符::前,方法的名称放在分隔符::后。比如,上面的Mask::getBrand,就是引用了Mask中定义的getBrand方法。方法名称后不需要加括号,因为我们并没有实际调用它。方法引用提高了代码的可读性,也使逻辑更加清晰。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

怎么构建方法引用?

可以构建方法引用的场景的有四种:

1. 静态方法

指向静态方法的引用,语法:类名::静态方法名,类名放在分隔符::前,:静态方法名放在分隔符::后。比如:

(String str) -> Integer.parseInt(str)

使用方法引用以后,可以简写为:

Integer::parseInt

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

2. 内部对象的实例方法

指向Lambda表达式内部对象的实例方法的引用,语法:类名::实例方法名,类名放在分隔符::前,:实例方法名放在分隔符::后。比如:

(Mask mask) -> mask.getBrand()

使用方法引用以后,可以简写为:

Mask::getBrand

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

3. 外部对象的实例方法

指向Lambda表达式外部对象的实例方法的引用,语法:实例名::实例方法名,类名放在分隔符::前,:实例方法名放在分隔符::后。比如:

String type = "N95";
Predicate<String> predicate = (String str) -> type.equals(str);
System.out.println(predicate.test("N95"));

其中,type是一个Lambda表达式外部的局部变量,使用方法引用以后,可以简写为:

String type = "N95";
Predicate<String> predicate = type::equals;
System.out.println(predicate.test("N95"));

如果对于Predicate接口还不熟悉,没关系,以后的文章会介绍到,这里暂且知道它的抽象方法的签名是(T) -> boolean就可以了。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

4. 构造方法

指向构造方法的引用,语法:类名::new,类名放在分隔符::前,new放在分隔符::后。比如:

(String brand, String type) -> new Mask(brand, type)

使用方法引用以后,可以简写为:

Mask::new

小测试

看了这么多,是不是摩拳擦掌准备试一试了?我们就来一个小测试:

  1. (char[] array) -> new String(array)
  2. (String str) -> str.length()
  3. (String type) -> mask.setType(type),其中的mask是一个Mask对象的局部变量。
  4. (String str) -> System.out.println(str)

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

请思考片刻…

.

.

.



.

.

.

宣布答案

  1. 因为(char[] array) -> new String(array)是一个构造方法的Lambda表达式,此种方法引用的语法是:类名::new,所以正确答案是:String::new
  2. 因为(String str) -> str.length()是一个内部对象的实例方法的Lambda表达式,此种方法引用的语法是:类名::实例方法名,所以正确答案是:String::length
  3. 因为(String type) -> mask.setType(type)中的mask是一个Mask对象的局部变量,它是一个包含外部对象的Lambda表达式,此种方法引用的语法是:实例名::实例方法名,所以正确答案是mask::setType
  4. 因为(String str) -> System.out.println(str)是一个静态方法的Lambda表达式,此种方法引用的语法是:类名::静态方法名,所以正确答案是System.out::println

怎么样?都答对了嘛?

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

《死磕Lambda表达式》系列

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

死磕Lambda表达式(三):更简洁的Lambda的更多相关文章

  1. 死磕Lambda表达式(二):Lambda的使用

    城市就是森林,每一个男人都是猎手,每一个女人都是陷阱.--<三体> 在哪使用Lambda表达式? 在上一篇文章(传送门)中介绍了Lambda表达式的基本语法,其中的举了一个Lambda表达 ...

  2. 【转】Linq表达式、Lambda表达式你更喜欢哪个?

    [转]Linq表达式.Lambda表达式你更喜欢哪个? 什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相 ...

  3. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  4. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  5. MySQL强人“锁”难《死磕MySQL系列 三》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 前言 最近数据库 ...

  6. C# Lambda表达式详解,及Lambda表达式树的创建

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  7. C#中Lambda表达式类型Expression不接受lambda函数

    在EF Core中我们经常会用System.Linq.Expressions系统命名空间的Expression<TDelegate>类型来作为EF Core的查询条件,比如: using ...

  8. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  9. JDK新特性-Lambda表达式的神操作

    一.Lambda表达式的介绍 Lambda表达式是 Java8 中最重要的新功能之一.使用 Lambda 表达 式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看 起来更简洁易懂.Lambd ...

随机推荐

  1. [LC] 79. Word Search

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  2. Linux 系统优化参数总结

    系统优化参数总结: net.ipv4.tcp_syncookies = 表示开启SYN Cookies.当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击 net.ipv4.t ...

  3. win10安装mudbox失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装mudbox失败或提示已安装,也有时候想重新安装mudbox的时候会出现本电脑windows系统已安装mudbox,你要是不留意直接安装mudbox,只会安装mu ...

  4. kendoUI 免费部分开发部分经验。

    kendo分多个版本,核心UI免费版.NET,JAVA,PHP对应的前后端开发版. 基础免费版开放的UI经多个测试,与收费封装的UI并无区别,收费版提供了后端代码和前端封装语法,使不懂JS前端的也可简 ...

  5. [洛谷P2785] 物理1(phsic1)-磁通量

    随便翻到的一道题...... 题目传送门 这道题是用向量叉积求多边形面积. 首先讲一下向量叉积(也叫外积). 设两个向量的坐标表示为(x1,y1).(x2,y2). 那么它们的叉积为x1*y2-x2* ...

  6. 吴裕雄--天生自然python编程:turtle模块绘图(3)

    turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...

  7. Scarpy框架安装教程

    在一切之前,建议升级pip,如果版本太低,安装会失败 升级pip命令: python -m pip install --upgrade pip 如果上面的命令不能用,用下面这个 easy_instal ...

  8. 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))

    我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...

  9. etcd安装部署步骤

    我是通过yum直接安装的(yum install etcd -y),其生成的配置文件在/etc/etcd/etcd.conf. 这里分单机版和集群版来介绍配置项 单机配置 ETCD_DATA_DIR: ...

  10. Java实体映射工具MapStruct的使用

    官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...