函数式接口-方法引用

定义

在这里插入图片描述

静态方法-方法引用

示例

在这里插入图片描述

  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与方法引用等价练习

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值