p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解
目录
- 方法引用概念
- 方法引用的分类
- 引用静态方法
- 引用成员方法
- 引用其他类的成员方法
- 引用本类的成员方法
- 引用父类的成员方法
- 引用构造方法
- 其他调用方法
- 使用类名引用成员方法
- 引用数组的构造方法
方法引用概念
方法引用是指把已经有的方法拿过来用,当作函数式接口的抽象方法的方法体
方法引用有以下规定
- 应用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参和返回值需要跟抽象方法保持一致
- 被引用方法的功能要满足当前需求
举例
import java.util.Arrays;public class Demo1 {public static void main(String[] args) {//数组进行倒序排列Integer[]arr = {1,2,9,5,4,3,0};//表示引用Demo1类里面的subtraction方法//把这个方法当作抽象方法的方法体Arrays.sort(arr,Demo1::subtraction);System.out.println(Arrays.toString(arr));}public static int subtraction(int num1,int num2){return num2-num1;}
}
方法引用的分类
- 引用静态方法
- 引用成员方法
- 引用其他类的成员方法
- 引用本类的成员方法
- 引用父类的成员方法
- 引用构造方法
- 其他调用方法
- 使用类名引用成员方法
引用数组的构造方法
引用静态方法
格式:类名::静态方法名
举例
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class Demo2 {public static void main(String[] args) {//方法引用(引用静态方法)//集合中有"1","2,"3","4","5",将其变成int类型ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"1","2","3","4","5");//常规方式ArrayList<Integer> list2 = new ArrayList<>();for (String s : list) {list2.add(Integer.parseInt(s));}System.out.println(list);list.stream().map(new Function<String, Object>() {@Overridepublic Object apply(String s) {int i = Integer.parseInt(s);return i;}}).forEach(s-> System.out.println(s));//方法引用list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));}
}
引用成员方法
格式:对象::成员方法
引用其他类的成员方法
格式:其他类对象::方法名
举例
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;public class Demo3 {public static void main(String[] args) {//集合中过滤数据//过滤出以张开头的3个字的名字ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三","李四","张旺财","张二","李四五","王五");//过滤数据list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(s -> System.out.println(s));//过滤数据list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张")&&s.length()==3;}}).forEach(s -> System.out.println(s));//方法引用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::方法名
(引用处不是静态方法)
引用父类的成员方法
格式:super::方法名
(引用处不是静态方法)
引用构造方法
格式:类名::new
举例
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {//集合中存储的数据将其封装成Student对象并收集到list集合中ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"李四,18","张军,20","张军,19","王五,22");List<Student> newList = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {String name = s.split(",")[0];int age = Integer.parseInt(s.split(",")[1]);return new Student(age, name);}}).collect(Collectors.toList());System.out.println(newList);//方法引用List<Student> newList2 = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(newList2);}
}
//==================================================
class Student{private int age;private String name;//被引用的构造方法public Student(String s) {this.name = s.split(",")[0];this.age = Integer.parseInt(s.split(",")[1]);}public Student() {}public Student(int age, String name) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}
}
其他调用方法
使用类名引用成员方法
格式:类名::成员方法
该种方法引用有以下规定
- 应用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参和需要跟抽象方法的第二个形参直到最后一个形参保持一致,返回值要保持一致
- 被引用方法的功能要满足当前需求
.
抽象方法的形参:
第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
在stream流中,第一个参数一般都指流里面的每一个数据
假设流中的数据都是字符串,那么使用这种方式进行方法引用,只能引用String类中的方法
第二个参数直到最后一个参数:跟被引用方法的形参一致。如果没有第二个参数,说明被引用的方法需要是无参的构造方法
package study.Stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class Demo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"aaa","bbb","ccc","ddd");list.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.print(s+" "));System.out.println();//方法引用list.stream().map(String::toUpperCase).forEach(s -> System.out.print(s+" "));}
}
局限性:不能引用所有类中的成员方法,是跟抽象方法的第一个参数有关。这个参数是什么类型的,那么就只能引用这个类中的方法
引用数组的构造方法
格式:数组类型[]::new
举例
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.IntFunction;public class Demo6 {public static void main(String[] args) {//将集合中的数据收集到数组中ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,2,3,4);Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});System.out.println(Arrays.toString(arr));//方法引用Integer[] arr2 = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr2));}
}