一、方法引用的概念
把已有方法直接拿过来用,当做函数式接口中抽象方法的方法体
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;
}条件
引用处必须是函数式接口
被引用的方法必须已经存在
被引用方法的形参和返回值需跟抽象方法保持一致
被引用方法的功能需满足当前需求
二、方法引用的分类
引用静态方法
格式:类名 : : 静态方法
//将集合中的字符串转变为整数
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);
}
本文详细介绍了Java中的方法引用概念,包括如何引用静态方法、成员方法、其他类的成员方法、本类的成员方法、父类的成员方法以及构造方法。通过方法引用,可以更简洁地实现函数式接口中的抽象方法,提高代码的可读性和效率。示例代码展示了如何在实际编程中应用方法引用,例如在集合排序和流操作中。
3374





