欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

死磕Lambda表达式(三):更简洁的Lambda

程序员文章站 2022-04-15 16:17:54
在之前的文章中介绍了Lambda表达式的基本语法和正确使用姿势,这次介绍如何写出更简洁、更易懂的Lambda表达式。 ......

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

在之前的文章中介绍了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技术干货。

请思考片刻…
.
.
.
死磕Lambda表达式(三):更简洁的Lambda
.
.
.

宣布答案

  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技术干货。