文章目录
- 一、方法引用
- 1.1、方法引用的理解
- 1.2、格式
- 1.3、举例
- 二、构造器引用
- 2.1、格式
- 2.2、例子
- 2.3、数组引用
一、方法引用
1.1、方法引用的理解
- 方法引用,可以看做是基于lambda表达式的进一步刻画
- 当需要提供一个函数式接口的实例时,可以使用
lambda表达式
提供此实例 - 当满足一定条件时,还可以使用
方法引用或构造器引用
替换lambda表达式
1.2、格式
总体理解:类(对象)::方法名
对象 :: 实例方法名
类 :: 静态方法名
类 :: 实例方法名
1.3、举例
前提:Lambda体只有
一句语句
,并且是通过调用一个对象/类
现有的方法来完成的
- 对象 :: 实例方法名
@Testpublic void test1() {// 1.匿名实现类Consumer<String> con1 = new Consumer<String>(){@overridepublic void accept(String s){System.out.pringln(s);}}// 2.lambda表达式Consumer<String> con1 = s -> System.out.println(s);// 3.方法引用Consumer<String> con2 = System.out::println;}
1、accept()方法的形参、返回值和println()方法的一样,所以可用
方法引用
代替lambda表达式
2、函数式接口中的抽象方法a在被重写时使用了某一个对象的实例方法b。如果方法a的形参列表、返回值类型
与实例方法b的形参列表、返回值类型都相同(满足多态场景也可以),则我们可以使用方法b实现对方法a的重写、替换。
- 类 :: 静态方法名
@Testpublic void test3() {// 1.匿名实现类Comparator<Integer> com1 = new Comparator<Integer>(){@overridepublic int compare(Integer o1,Integer o2){return Integer.compare(o1,o2);}}// 2.lambda表达式Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);// 3.方法引用Comparator<Integer> com2 = Integer::compare;}
函数式接口中的抽象方法a在被重写时使用了某一个类的静态方法b。如果方法a的
形参列表、返回值类型
与方法b的形参列表、返回值类型都相同(满足多态场景也可以),则可以使用方法b实现对方法a的重写、替换。
- 类 :: 实例方法名
@Testpublic void test5() {// 1.匿名实现类Comparator<String> com1 = new Comparator<String>(){@overridepublic int compare(String o1,String o2){retrun o1.compareTo(o2);}}// 2.lambda表达式Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);// 3. 方法引用Comparator<String> com2 = String :: compareTo;}
函数式接口中的抽象方法a在被重写时使用了某一个对象的方法b。如果方法a的
返回值类型
与方法b的返回值类型
相同(满足多态场景也可以),同时方法a的形参列表中有n
个参数,方法b的形参列表有n-1
个参数,且方法a的第1个参数作为方法b的调用者,且方法a的后n-1参数与方法b的n-1参数匹配(类型相同或满足多态场景也可以)
二、构造器引用
2.1、格式
类名::new
- 调用类名对应的类中的某一个确定的构造器
- 具体调用的是哪一个构造器?取决于函数式接口的抽象方法的形参列表
2.2、例子
@Testpublic void test1(){// 1.匿名实现类Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};// 2.lambda表达式Supplier<Employee> sup1 = () -> new Employee();// 3.构造器引用, 调用的是Employee类中的空参构造器Supplier<Employee> sup2 = Employee :: new;}
@Testpublic void test2(){// 1.lambda表达式Function<Integer,Employee> func1 = id -> new Employee(id);// 2.构造器引用,调用的是Employee类中的Employee(int id)这个构造器Function<Integer,Employee> func2 = Employee :: new;}
2.3、数组引用
- 格式:
数组类型名::new
- 例子
@Test
public void test(){// 1.匿名实现类Function<Integer,String[]> func1 = new Function<Integer,String[]>{@overridepublic String[] apply(Integer length){return new String[length];}}// 2.lambda表达式Function<Integer,String[]> func1 = length -> new String[length];String[] arr1 = func1.apply(5);// 3.数组引用Function<Integer,String[]> func2 = String[] :: new;String[] arr2 = func2.apply(10);
}