Java 方法引用 学习笔记

qaq

  • 方法引用就是把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
  • ::是方法引用符

要求

  • 需要有函数式接口
  • 被引用的方法必须已经存在
  • 被引用方法的形参和返回值需要和抽象方法保持一致
  • 被引用方法的功能要满足当前需求
import java.util.Arrays;

public class FunctionDemo {
    public static void main(String[] args) {
        Integer[] list = {3, 5, 1, 2, 4};
        
        Arrays.sort(list, FunctionDemo::subtraction);
        System.out.println(Arrays.toString(list));
    }

    public static int subtraction(int a, int b) {
        return b - a;
    }
}

各种方法的引用格式

引用静态方法

  • 格式类名::静态方法
  • Integer::parseInt

引用成员方法

  • 格式对象::成员方法
  • 其他类:其他类对象::方法名
  • 本类:this::方法名(引用处不能是静态方法,静态方法中无this)
  • 父类:super::方法名(引用处不能是静态方法,静态方法中无super)

引用构造方法

  • 格式:类名::new
//psvm
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc");
list.stream().map(Student::new);//这样会调用Student中和stream流里数据类型一致的构造方法
//Student中添加对应的构造方法
public Student(String str) {
    
}

使用类名引用成员方法

  • 格式:类名::成员方法

  • 第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法

    • 在Stream流里面,第一个参数一般都表示流里面的每一个数据,假设流里面的数据是字符串,那么使用这种方法进行方法引用,只能引用String这个类中的方法
    • 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法
    ArrayList<String> list = new ArrayList<>();
    Collections.addAll(list, "aaa", "bbb", "ccc");
    //拿着流里面的每一个数据,去调用String类中的toUpperCase方法,方法的返回值就是转换之后的结果
    list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
  • 局限性

    • 不能引用所有类中的成员方法
    • 与抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法
  • 在Stream流当中,第一个参数一般都表示流里面的每一个数据。

list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));

引用数组的构造方法

  • 格式:数据类型[]::new
  • 数组的类型需要和流中数据类型保持一致
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class FunctionDemo1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);

        Integer[] arr = list.stream().toArray(Integer[]::new);
        System.out.println(Arrays.toString(arr));
    }
}
img_show