Java8方法引用笔记240128
方法引用用双冒号::
当静态方法的参数个数和类型和拉姆达表达式提供的参数相同时, 可以用方法引用
方法引用的类型主要有以下四种:
-
静态方法引用:类名::staticMethodName
-
实例方法引用:instanceReference::instanceMethodName
-
构造方法引用:类名::new
-
类成员方法引用:类名::methodName
Java8方法引用示例
示例1:
import java.util.Arrays;
import java.util.List;public class 方法引用示例类 {public static void 被引用的方法(Object o) {System.out.print(o);}public static void main(String[] arguments) {List<Object> list = Arrays.asList("a","b","c",1,2,3,'a','b','c');list.stream() .forEach(System.out::println); // 例一list.stream() .forEach(方法引用示例类::被引用的方法); //例二 引用本类的静态方法}
}
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class 方法引用示例类 {public static void 类被引用的静态方法(Object o) {System.out.print(o);}public 方法引用示例类() {}public 方法引用示例类(Object o) { System.out.print(o); }public void 实例被引用的方法(Object o) { System.out.print(o); }public static void main(String[] arguments) {方法引用示例类 方法引用示例实例 = new 方法引用示例类();List<Object> list = Arrays.asList("a","b","c",1,2,3,'a','b','c',1.23,4.56);list .forEach(System.out::println); // 例一list .forEach(方法引用示例类::类被引用的静态方法); //例二 引用本类的静态方法list .forEach(方法引用示例类::new); //例三 引用本类的构造方法list .forEach(方法引用示例实例::实例被引用的方法); //例四 引用本类的实例的方法Stream.of(1,2,3.14,"a","b",'c','d').forEach(System.out::println); // 例一Stream.of(1,2,3.14,"a","b",'c','d').forEach(方法引用示例类::类被引用的静态方法); //例二 引用本类的静态方法Stream.of(1,2,3.14,"a","b",'c','d').forEach(方法引用示例类::new); //例三 引用本类的构造方法Stream.of(1,2,3.14,"a","b",'c','d').forEach(方法引用示例实例::实例被引用的方法); //例四 引用本类的实例的方法}
}
引用System.out.println:
List<String> names = Arrays.asList("John", "Jane", "Jack");
names.forEach(v->System.out.println(v)); //Lambda表达式
names.forEach(System.out::println); // 修改为方法引用形式
引用构造方法:
List<String> names = Arrays.asList("John", "Jane", "Jack");
names.forEach(name -> new Person(name)); //Lambda表达式
names.forEach(Person :: new); // 修改为方法引用形式
- 引用数组的实例方法:
Integer[] numbers = {1, 2, 3, 4, 5};
Arrays.sort(numbers, (a, b) -> Integer.compare(a, b)); // 使用Lambda表达式
Arrays.sort(numbers, Integer::compare); // 使用方法引用
注意,不是所有的方法都可以用方法引用来表示。例如,那些带有多个参数的方法、或者没有返回值的方法就不能用方法引用来表示。对于这些情况,你仍然需要使用Lambda表达式。