使用方法引用以后,可以简写为:
Comparator comparator = Comparator.comparing(Mask::getBrand);
当你需要方法引用时,目标引用放在分隔符::
前,方法的名称放在分隔符::
后。比如,上面的Mask::getBrand
,就是引用了Mask
中定义的getBrand
方法。方法名称后不需要加括号,因为我们并没有实际调用它。方法引用提高了代码的可读性,也使逻辑更加清晰。
怎么构建方法引用?
可以构建方法引用的场景的有四种:
1. 静态方法
指向静态方法的引用,语法:类名::静态方法名
,类名放在分隔符::
前,:静态方法名放在分隔符::
后。比如:
(String str) -> Integer.parseInt(str)
使用方法引用以后,可以简写为:
Integer::parseInt
2. 内部对象的实例方法
指向Lambda表达式内部对象的实例方法的引用,语法:类名::实例方法名
,类名放在分隔符::
前,:实例方法名放在分隔符::
后。比如:
(Mask mask) -> mask.getBrand()
使用方法引用以后,可以简写为:
Mask::getBrand
3. 外部对象的实例方法
指向Lambda表达式外部对象的实例方法的引用,语法:实例名::实例方法名
,类名放在分隔符::
前,:实例方法名放在分隔符::
后。比如:
String type = “N95”;
Predicate predicate = (String str) -> type.equals(str);
System.out.println(predicate.test(“N95”));
其中,type
是一个Lambda表达式外部的局部变量,使用方法引用以后,可以简写为:
String type = “N95”;
Predicate predicate = type::equals;
System.out.println(predicate.test(“N95”));
如果对于Predicate
接口还不熟悉,没关系,以后的文章会介绍到,这里暂且知道它的抽象方法的签名是(T) -> boolean
就可以了。
4. 构造方法
指向构造方法的引用,语法:类名::new
,类名放在分隔符::
前,new
放在分隔符::
后。比如:
(String brand, String type) -> new Mask(brand, type)
使用方法引用以后,可以简写为:
Mask::new
小测试
看了这么多,是不是摩拳擦掌准备试一试了?我们就来几个小测试:
-
(char[] array) -> new String(array)
-
(String str) -> str.length()
-
(String type) -> mask.setType(type)
,其中的mask
是一个Mask
对象的局部变量。 -
(String str) -> System.out.println(str)
请思考片刻…
.
.
.
.
.
.
宣布答案:
-
因为
(char[] array) -> new String(array)
是一个构造方法的Lambda表达式,此种方法引用的语法是:类名::new
,所以正确答案是:String::new
。 -
因为
(String str) -> str.length()
是一个内部对象的实例方法的Lambda表达式,此种方法引用的语法是:类名::实例方法名
,所以正确答案是:String::length
。 -
因为
(String type) -> mask.setType(type)
中的mask
是一个Mask
对象的局部变量,它是一个包含外部对象的Lambda表达式,此种方法引用的语法是:实例名::实例方法名
,所以正确答案是mask::setType
。 -
因为
(String str) -> System.out.println(str)
是一个静态方法的Lambda表达式,此种方法引用的语法是:类名::静态方法名
,所以正确答案是System.out::println
。
怎么样?都答对了嘛?