Java8方法引用笔记240128
方法引用用双冒号::
当静态方法的参数个数和类型和拉姆达表达式提供的参数相同时, 可以用方法引用
方法引用的类型主要有以下四种:
静态方法引用:类名::staticMethodName
实例方法引用:instanceReference::instanceMethodName
构造方法引用:类名::new
类成员方法引用:类名::methodName
示例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表达式。