定义
静态方法-方法引用
示例
public static void main(String[] args) {
// 1. 生成一个学生对象list,男女各两个
List<Student> students = new ArrayList<>();
students.add(new Student("张三", "男"));
students.add(new Student("李四", "男"));
students.add(new Student("王五", "女"));
students.add(new Student("赵六", "女"));
// 2. 使用stream流和方法引用,筛选出男性学生
students.stream()
// .filter(student -> "男".equals(student.getSex())) // 这是lambda表达式的写法
.filter(MethodReference::isMale) // 这是方法引用的写法
.forEach(System.out::println);
}
// 准备一个静态方法,参数是Student对象,返回值是boolean
public static boolean isMale(Student student) {
return "男".equals(student.getSex());
}
非静态方法-方法引用
示例
public class Student {
public String name;
public String sex;
public static boolean isMale(Student student) {
return "男".equals(student.getSex());
}
}
// 2. 使用stream流和方法引用,筛选出男性学生
students.stream()
// .filter(student -> "男".equals(student.getSex())) // 这是lambda表达式的写法
// .filter(MethodReference::isMale) // 这是静态方法引用的写法
.filter(Student::isMale) // 这是实例方法引用的写法
.forEach(System.out::println);
非静态方法(对象)-方法引用
public static class Util {
public boolean isMale(Student student) {
return "男".equals(student.getSex());
}
}
- 需要借助工具类的实例对象
Util util = new Util();
// 2. 使用stream流和方法引用,筛选出男性学生
students.stream()
// .filter(student -> "男".equals(student.getSex())) // 这是lambda表达式的写法
// .filter(MethodReference::isMale) // 这是静态方法引用的写法
// .filter(Student::isMale) // 这是类非静态方法引用的写法
.filter(util::isMale) // 这是对象非静态方法引用的写法
.forEach(System.out::println);
方法引用-构造器
示例
代码示例
- 无参构造:使用Supplier接口
- 有参构造:使用Function接口
// 构造器 方法引用
// 不同的构造方法,缺失相同的写法:类名::new,如何进行区分呢?
// 无参构造 无参但是有返回值 使用Supplier接口
Supplier<Student> supplier = Student::new;
// 有参构造 name 一个参数,有返回值 使用Function接口
Function<String, Student> function = Student::new;
// 有参构造 name + sex 两个参数,有返回值 使用BiFunction接口
BiFunction<String, String, Student> biFunction = Student::new;
// 使用Supplier接口 调用get方法
Student student1 = supplier.get();
// 使用Function接口 调用apply方法
Student student2 = function.apply("张三");
// 使用BiFunction接口 调用apply方法
Student student3 = biFunction.apply("李四", "男");
this\super 非静态方法-方法引用
区别
super和this的方法引用,只能在本类中使用
代码
public Student(String name, String sex) {
Supplier<Student> supplier = Student::new;
Student student = supplier.get();
// 使用this::setName和this::setSex方法引用
// 因为只有参数,没有返回值,所以使用Consumer接口
Consumer<String> newName = this::setName;
Consumer<String> newSex = this::setSex;
// 调用accept方法
newName.accept(name);
newSex.accept(sex);
}
对比
特例
这种写法不报错,但是
不推荐
这种写法,就有歧义性
lambda与方法引用等价练习