今天再来给大家介绍下函数式接口和方法引用。
函数式接口
问:Lambda 表达式的类型是什么?
答:函数式接口
问:函数式接口是什么?
答:只包含一个抽象方法的接口,称为函数式接口 (functional interface) , 一般用 @FunctionalInterface 注解来检测是否是函数式接口。
自定义函数式接口
@FunctionalInterface
public interface MyFunctionalInterface {
String test(String p);
}
使用泛型
@FunctionalInterface
public interface MyFunctionalInterface<T,R> {
R test(T t);
}
函数式接口作为方法参数
public void test(MyFunctionalInterface mfi,String str) {
System.out.println(mfi.getValue(str));
}
调用test()
test(p -> p.toUpperCase(),"luojie");
控制台输出:
LUOJIE
常见函数式接口
方法引用
问:什么是方法引用?
答:当我们需要完成的 Lambda 体操作,已经有实现的方法了,可以使用方法引用!
问:为什么用方法引用?
答:省略参数,少写代码
举个例子
Comparator<Integer> com2 = (x, y) -> Integer.compare(x,y);
//上面我们之前学过的Lambda表达式,其中Lambda体操作是比较两个整数的大小,
//而且Integer的compare()正好完就是我需要完成的操作。
//可以方法引用替代
Comparator<Integer> 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")
作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。