【Java】方法引用

本文详细介绍了Java中的方法引用概念,包括如何引用静态方法、成员方法、其他类的成员方法、本类的成员方法、父类的成员方法以及构造方法。通过方法引用,可以更简洁地实现函数式接口中的抽象方法,提高代码的可读性和效率。示例代码展示了如何在实际编程中应用方法引用,例如在集合排序和流操作中。

一、方法引用的概念

把已有方法直接拿过来用,当做函数式接口中抽象方法的方法体

Arrays.sort(arr, new Comparator<Integer>()  {
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});
//方法引用

/*
*    ::为方法引用符
*    Function为类名
*    s为方法名
*/

Arrays.sort(arr, Function::s);

public class s (int a, int b) {
    return a - b;
}

条件

  1. 引用处必须是函数式接口

  1. 被引用的方法必须已经存在

  1. 被引用方法的形参和返回值需跟抽象方法保持一致

  1. 被引用方法的功能需满足当前需求

二、方法引用的分类

引用静态方法

格式:类名 : : 静态方法

 //将集合中的字符串转变为整数
       ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "1", "2", "3", "4", "5");
        list.stream().map(Integer::parseInt).forEach(System.out::println);

引用成员方法

格式:对象 : : 成员方法

引用其他类的成员方法

格式:其他类对象 : : 方法名

ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "郑小胖", "张小三", "李小四", "王小五", "赵小六", "田小七", "张三", "李四", "郑八仙");
        list.stream().filter(new SS()::ss).forEach(System.out::println);
//其他类
public class SS {
    public boolean ss (String m) {
        return m.startsWith("郑") && m.length() == 3;
    }
}
引用本类的成员方法

格式:this : : 方法名

静态方法中是没有this的,如需在静态方法中引用成员方法,可通过创建本类对象来引用

public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "郑小胖", "张小三", "李小四", "王小五", "赵小六", "田小七", "张三", "李四", "郑八仙");
        list.stream().filter(new Test()::m).forEach(System.out::println);
    }
    public boolean m(String s) {
        return s.startsWith("郑") && s.length() == 3;
    }
}
引用父类的成员方法

格式:super : : 方法名

引用构造方法

格式:类名: : new

在引用构造方法时,不需要管返回值,只需保证其生成的对象跟抽象方法一致就行

ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,15", "周芷若,14", "赵梅,12", "王五,11", "甜甜,24");
        List<Student> collect = list.stream().map(Student::new).collect(Collectors.toList());
        System.out.println(collect);
//Student类的构造方法
public Student(String s) {
        this.age = Integer.parseInt(s.split(",")[1]);
        this.name = s.split(",")[0];
    }

其他调用方式

使用类名引用成员方法

特有规则

被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需保持一致

抽象方法第一个形参:

表示引用方法的调用者,决定了可以引用哪些类中的方法

在Stream流当中,第一个参数一般表示流里面的每一个数据(设里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法)

抽象方法第二至最后一个形参:

跟被引用方法保持一致,如果没有,说明被引用的方法需为无参的成员方法

局限性:

不能引用所有类中的抽象方法,只能引用第一个参数类型的方法

//将字符串转换为大写并输出
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");
        list.stream().map(String::toUpperCase).forEach(System.out::println);
引用数组的构造方法

格式:数据类型[] : : new(eg:Integer[] : : new)

注意:数组的类型,需要跟流中数据的类型保持一致

 //将集合中的数据收集到数组中
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5, 6);
        Integer[] integers = list.stream().toArray(Integer[]::new);
        for (Integer i : integers) {
            System.out.println(i);
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊呜冷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值