方法引用

将已经有的方法拿过来用,当作函数式接口中抽象方法的方法体

  • 引用处必须是函数式接口;

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

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

  • 被引用方法的功能要满足当前需求

:: :方法引用符;

方法引用的分类

引用静态方法

  • 格式:

    • 类名::静态方法
      • 范例:Integer::parseInst
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.util.ArrayList;
    import java.util.Collections;

    public class MethodCite1 {
    public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    Collections.addAll(list, "1", "2", "3", "4", "5");
    list.stream().map(Integer::parseInt)
    .forEach(s -> System.out.print(s + "\t"));
    }
    }

引用成员方法:

  • 格式:

    • 对象::成员方法

      • 其他类:其他类对象::方法名

        1
        2
        3
        4
        5
        6
        7
        public class MethodCite2 {
        public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
        list.stream().filter(Method::test).forEach(s -> System.out.print(s + "\t"));
        }
        }
      • 本类:this::方法名

      • 父类:super::方法名

引用构造方法

  • 再需要调用的类中重写一个构造方法,然后再主函数中调用;

1
2
3
4
5
6
7
8
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "蔡坤坤,24", "叶齁威,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
list.stream().map(Student::new).forEach(s -> System.out.print(s + "\t"));
}
}

使用类名引用成员方法

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

  • 范例:String::substring

1
2
3
4
5
6
7
public class MethodCite3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");
list.stream().map(String::toUpperCase).forEach(s -> System.out.print(s + "\t"));
}
}

引用数组的构造方法

  • 格式:数据类型[] :: new

  • 范例:int[ ]::new

1
2
3
4
5
6
7
8
public class MethodCite4 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6);
Integer[] array = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(array));
}
}