Java重温学习笔记,Java8新特性:方法引用
方法引用通过方法的名字来指向一个方法,它可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。
一、方法引用可以做什么?看如下代码:
import java.util.*; import java.util.stream.Collectors; public class MyDemo { public static void main(String[] args) { List<String> strList = Arrays.asList(new String[] { "a", "c", "b" }); strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s)); } }
采用方法引用后,可以简化为如下:
import java.util.*; import java.util.stream.Collectors; public class MyDemo { public static void main(String[] args) { List<String> strList = Arrays.asList(new String[] { "a", "c", "b" }); strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println); } }
二、方法引用有四种形式
- 静态方法引用 : ClassName :: staticMethodName
- 构造器引用 : ClassName :: new
- 类的任意对象的实例方法引用: ClassName :: instanceMethodName
- 特定对象的实例方法引用 : object :: instanceMethodName
1. 静态方法引用
System.out::println 等价于Lambda表达式 s -> System.out.println(s) ,代码示例:
import java.util.*; import java.util.stream.Collectors; public class MyDemo { public static void main(String[] args) { //lambda表达式使用: Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> MyDemo.println(s)); //静态方法引用: Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(MyDemo::println); } public static void println(String s) { System.out.println(s); } }
2. 构造器引用
() -> new ArrayList<String>() 等价于 ArrayList<String>::new,代码示例:
Supplier<List<String>> supplier1= () -> new ArrayList<String>();
等价于
Supplier<List<String>> supplier = ArrayList<String>::new;
3. 类的任意对象的实例方法引用
Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2));
等价于
Arrays.sort(strs, String::compareToIgnoreCase);
4. 特定对象的实例方法引用
import java.util.*; import java.util.stream.Collectors; public class MyDemo { public static void main(String[] args) { MyDemo test = new MyDemo(); // lambda表达式使用: Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> test.println(s)); // 特定对象的实例方法引用: Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(test::println); } public void println(String s) { System.out.println(s); } }
三、总结
方法引用代替Lambda表达式对代码的简化程度,远远没有Lambda表达式代替匿名类的简化程度大, 有时反而增加了代码的理解难度。
为了增强可读性,没有必要刻意使用方法引用。
本文参考:
https://www.jianshu.com/p/62465b26818f
https://www.runoob.com/java/java8-method-references.html