Java8新特性之方法引用与构造器引用

举报
lwq1228 发表于 2021/10/30 13:55:47 2021/10/30
【摘要】 一、方法引用当要传递给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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。