Java8新特性之方法引用与构造器引用
【摘要】 一、方法引用当要传递给Lambda体的操作,已经有实现的方法时可以使用方法引用!(注:实现抽象方法的参数列表, 必须与方法引用方法的参数列表保持一致! )方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来,主要有以下三种使用情况:对象::实例方法类::静态方法类::实例方法1、对象::实例方法// 直接使用Lambda表达式Consumer<String> con1 = st...
一、方法引用
当要传递给Lambda体的操作,已经有实现的方法时可以使用方法引用!(注:实现抽象方法的参数列表, 必须与方法引用方法的参数列表保持一致! )
方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来,主要有以下三种使用情况:
- 对象::实例方法
- 类::静态方法
- 类::实例方法
1、对象::实例方法
// 直接使用Lambda表达式
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("使用Lambda表达式 --> Hello World!");
// 改为方法引用如下
Consumer<String> con2 = System.out::println;
con2.accept("使用方法引用 --> Hello World!");
测试结果:
2、类::静态方法
// 直接使用Lambda表达式
BiFunction<Double, Double, Double> fun1 = (x, y) -> Math.max(x, y);
System.out.println("使用Lambda表达式 --> " + fun1.apply(1.5, 22.2));
// 改为方法引用如下
BiFunction<Double, Double, Double> fun2 = Math::max;
System.out.println("使用方法引用 --> " + fun2.apply(1.5, 22.2));
测试结果:
3、类::实例方法
// 直接使用Lambda表达式
BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
System.out.println("使用Lambda表达式 --> " + bp1.test("abc", "abc"));
// 改为方法引用如下
BiPredicate<String, String> bp2 = String::equals;
System.out.println("使用方法引用 --> " + bp2.test("abc", "abc"));
测试结果:
注意:当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时可以使用:ClassName::methodName 方式进行调用。
二、构造器引用
1、格式
ClassName::new
2、说明
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,构造器参数列表要与接口中抽象方法的参数列表一致!
3、举例
User.java类:
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
构造器引用:
Function<String, User> fun1 = (name) -> new User(name);
User user1 = fun1.apply("张三");
System.out.println("使用Lambda表达式 --> " + user1.getName());
Function<String, User> fun2 = User::new;
User user2 = fun2.apply("张三");
System.out.println("使用构造器引用 --> " + user2.getName());
测试结果:
三、数组引用
1、格式
type[]::new
2、举例
// 直接使用Lambda表达式
Function<Integer, String[]> fun1 = (args) -> new String[args];
String[] strs1 = fun1.apply(10);
System.out.println("使用Lambda表达式 --> " + strs1.length);
// 改为数组引用如下
Function<Integer, String[]> fun2 = String[]::new;
String[] strs2 = fun2.apply(10);
System.out.println("使用数组引用 --> " + strs2.length);
测试结果:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)