目录
一、什么是方法引用
二、方法引用的规则
三、方法引用的分类:
(一)、引用静态方法
(二)、引用成员方法
1、引用其他类的成员方法
2、引用本类的成员方法
3、引用父类的成员方法
(三)、引用构造方法
(四)、其他调用方式
1、使用类名引用成员方法
2、引用数组的构造方法
把已经有的方法拿过来,当做函数式接口中抽象方法的方法体。
Java的方法引用是一种新的语法,可以简化lambda表达式的使用。方法引用可以将已有的方法作为lambda表达式的替代进行传递。在Java中,方法引用使用双冒号(::)操作符来表示。
- 引用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参和返回值需要跟抽象方法保持一致
- 被引用方法的功能要满足当前需求
格式:类名::静态方法
范例:Integer::parseInt
ArrayList list = new ArrayList<>();
Collections.addAll(list, "1", "2", "3", "4", "5");
List collect = list.stream().map(Integer::parseInt).collect(Collectors.toList());
System.out.println(collect);
格式:对象::成员方法
格式:其他类对象::成员方法
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Collections.addAll(list, "张无忌", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));
}
class StringOperation{
public boolean stringJudge(String s){
return s.startsWith("张") && s.length() == 3;
}
}
格式:this::成员方法
注:如果是在静态方法中,是没有this的,只能用对象名
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Collections.addAll(list, "张无忌", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
List collect= new Demo4().method(list);
System.out.println(collect);
}
public List method(List list){
return list.stream().filter(this::stringJudge).collect(Collectors.toList());
}
public boolean stringJudge(String s){
return s.startsWith("张") && s.length() == 3;
}
格式:super::成员方法
注:如果是在静态方法中,是没有super的,只能用对象名
public class Demo5 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Collections.addAll(list, "张无忌", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
List collect = new Son().method(list);
System.out.println(collect);
}
}
class Son extends Father {
public List method(List list){
return list.stream().filter(super::stringJudge).collect(Collectors.toList());
}
}
class Father{
public boolean stringJudge(String s){
return s.startsWith("张") && s.length() == 3;
}
}
格式:类名::new
范例:Student::new
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Collections.addAll(list, "张无忌,32", "张强,29", "张三丰,56", "张翠山,48", "张良,25", "王二麻子,28", "谢广坤,39");
List collect = list.stream().map(Student::new).collect(Collectors.toList());
System.out.println(collect);
}
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String s) {
this.name = s.split(",")[0];
this.age = Integer.parseInt(s.split(",")[1]);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
…………
}
格式:类名::成员方法
范例:String::substring
特有规则:
- 引用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
- 被引用方法的功能要满足当前需求
抽象方法形参的详解:
- 第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法,在stream 流当中,第一个参数一般都表示流里面的每一个数据。假没流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用 string 这个类中的方法
- 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法
局限性:
不能引用所有类中的成员方法。是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。
ArrayList list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");
List collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect);
格式:类名::new
范例:Student::new
ArrayList list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
Integer[] arr = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(arr));