4.方法引用和构造器引用
1.方法引用:若lamada体中的函数体已经有方法实现了,我们可以使用"方法引用"
可以理解为方法引用为lamada表达式的另外一种表示
主要有三种语法结构:
1.1
对象::示例方法名
1.2
类::静态方法名
1.3
类::示例方法名
1.1对象::示例方法名
案例:
1.直接使用简单的核心函数式接口
Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("你好lamada");
2.升级:如果函数式接口中的方法参数列表和对象方法的参数列表和返回值一致时,可以使用以下
//对象函数(PrintStream)的参数列表和返回值类型必须和函数Consumer的参数列表和返回值类型一致
重点1:如PrintStream对象中的println方法的参数列表和返回值类型和Consumer函数式接口的方法参数列表和返回值一致,可以使用以下
PrintStream ps = System.out;
Consumer<String> consumer1 = ps::println;
consumer1.accept("你好Consumer1");
3.第三种方式:lamada体中使用外部对象调用方法的形式
PrintStream ps = System.out;
Consumer<String> consumer2 = (x) -> ps.println(x);
consumer2.accept("你好Consumer2");
4.优化方式:System.out就是PrintStream对象
Consumer<String> consumer3=System.out::println;
consumer3.accept("consumer3");
类::静态方法名
样例如下:进行两个数比较大小
/*
测试lamada方法调用:
类::方法名 Integer.compare为Integer的静态方法
*/
@Test
public void test9() {
//重点1.第一种方式:使用平常的lamada表达式,发小compare为Integer的静态方法,所以可以升级为第二种方式
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
int compare = com.compare(2, 3);
System.out.println("第一种情况:" + compare);
//2.第二种方式:直接使用类::静态方法的形式进行调用,但是此种方法的前提条件是
1.函数式接口(Comparator)的方法入参和lamada体中类的方法(Integer.compareTo)入参一致
2.函数式接口(Comparator)的返回值类型和lamada体中类的方法(Integer.compareTo)返回值类型一致
Comparator<Integer> com1 = Integer::compareTo;
int compare1 = com1.compare(2, 3);
System.out.println("第二种情况:" + compare1);
类名::方法名
/*
类名::方法名
1.lambda 体中调用方法的参数列表和返回值类型。要与函数式接口的抽象方法的函数式列表和返回值类型保持一致
2.若lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数,可以使用ClassName:: method
如:(x,y) -> x.equals(y)
*/
@Test
public void test10() {
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
boolean test = bp.test("你好", "你好");
System.out.println(test);
BiPredicate<String, String> bp1 = String::equals;
boolean test1 = bp1.test("你好1", "你好1");
System.out.println(test1);
}