学会这个测试员必懂 Lambda 小知识!

 学会这个测试员必懂 Lambda 小知识!_第1张图片

今天再来给大家介绍下函数式接口和方法引用。

函数式接口

问:Lambda 表达式的类型是什么?

答:函数式接口

问:函数式接口是什么?

答:只包含一个抽象方法的接口,称为函数式接口 (functional interface) , 一般用 @FunctionalInterface 注解来检测是否是函数式接口。

自定义函数式接口

@FunctionalInterfacepublic interface MyFunctionalInterface {    String test(String p);}
使用泛型@FunctionalInterfacepublic interface MyFunctionalInterface {    R test(T t);}

函数式接口作为方法参数

​​​​​​​

public void test(MyFunctionalInterface mfi,String str) {    System.out.println(mfi.getValue(str));}
调用test()test(p -> p.toUpperCase(),"luojie");控制台输出:LUOJIE

常见函数式接口

函数式接口名称 参数类型 返回值 方法
Consumer T void void accept(T t)
Supplier T T get();
Function T R R apply(T t);
Predicate T boolean boolean test(T t);
BiFunction T,U R R apply(T t, U u);
UnaryOperator T T T apply(T t);
BinaryOperator T,T T T apply(T t1, T t2);
BiConsumer T,U void void accept(T t, U u)

方法引用

问:什么是方法引用?

答:当我们需要完成的 Lambda 体操作,已经有实现的方法了,可以使用方法引用!

问:为什么用方法引用?

答:省略参数,少写代码

举个例子

​​​​​​​

Comparator com2 = (x, y) -> Integer.compare(x,y);//上面我们之前学过的Lambda表达式,其中Lambda体操作是比较两个整数的大小,//而且Integer的compare()正好完就是我需要完成的操作。//可以方法引用替代Comparator com3 = Integer::compare;

方法引用格式

方法引用使用操作符 :: 将方法名和对象或类的名字分开。
分三种格式:

  • 类::静态方法

  • 对象::实例方法

  • 类::实例方法

类::静态方法

​​​​​​​

(x, y) -> Integer.compare(x,y);方法引用改造:Integer::compare;

对象::实例方法

​​​​​​​

(x) -> System.out.printf(x);方法引用改造:System.out::println;

类::实例方法

​​​​​​​

test((x,y)->x.equals(y),"123","123");方法引用改造:test(String::equals,"123","abc");  注意:当引用方法的第一个参数是调用对象,并且第二个参数是需要传入参数(或无参数)时:ClassName::methodName比如上例子中:"123"当作equals方法调用对象,"abc"为传入equals()参数。相当于:"123".equals("abc")

 

学会这个测试员必懂 Lambda 小知识!_第2张图片 

你可能感兴趣的:(java,开发语言)