资讯专栏INFORMATION COLUMN

Java 8 新特性之方法引用

wudengzan / 2470人阅读

摘要:概述简介若体中的功能,已经有方法提供了实现,可以使用方法引用可以将方法引用理解为表达式的另外一种表现形式方法引用的三种形式对象的引用实例方法名类名静态方法名类名实例方法名注意方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象

1. 概述 1.1 简介

若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用(可以将方法引用理解为 Lambda 表达式的另外一种表现形式)

方法引用的三种形式

对象的引用::实例方法名

类名::静态方法名

类名::实例方法名

注意:

①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!

②若 Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

2. 方法引用 2.2 对象的引用::实例方法名
public class Employee implements Serializable {

    private int id;
    private String name;
    private int age;
    private double salary;

    public Employee() {
    }

    public Employee(String name) {
        this.name = name;
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Employee(int id, String name, int age, double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    
    // 省略 getter 和 setter 方法
}
@Test
public void t1() {
    // lambda 表达式方式
    PrintStream printStreamLamBda = System.out;
    Consumer consumerLambda = (x) -> printStreamLamBda.println(x);
    consumerLambda.accept("hello lambda");

    // 方法引用方式
    PrintStream printStream = System.out;
    // 使用方法引用前提是 Consumer 的 accept 方法的参数列表和返回值必须与 println 方法的参数列表和返回值一致(参考注意①)
    Consumer con = printStream::println;
    con.accept("hello method!");
}

@Test
public void t2(){
    Employee emp = new Employee(100,"ling",18,10000);

    // lambda 表达式方式
    Supplier supplierLambda = () -> emp.getName();
    System.out.println(supplierLambda.get());

    // 方法引用方式
    Supplier supplier = emp::getName;
    System.out.println(supplier.get());
}
2.3 类名::静态方法名
@Test
public void t3(){
    BiFunction fun = (x, y) -> Math.max(x, y);
    System.out.println("Lambda : " + fun.apply(1.5, 22.2));

    System.out.println("------------------------------------");

    BiFunction fun2 = Math::max;
    System.out.println("方法引用 : " + fun2.apply(1.2, 1.5));
}
2.4 类名::实例方法名

Employee 中添加方法

public String show() {
    return "测试方法引用!";
}

测试方法

@Test
public void test5(){
    BiPredicate bp = (x, y) -> x.equals(y);
    System.out.println(bp.test("ling", "ling"));

    System.out.println("------------------------------------");

    BiPredicate bp2 = String::equals;
    System.out.println(bp2.test("ling", "ling"));

    System.out.println("------------------------------------");


    Function fun = (e) -> e.show();
    System.out.println(fun.apply(new Employee()));

    System.out.println("------------------------------------");

    Function fun2 = Employee::show;
    System.out.println(fun2.apply(new Employee()));
}
3. 构造器引用 3.1 简介

使用构造器引用来创建对象

注:被调用的构造器的参数列表,需要与函数式接口中参数列表保持一致!

构造器引用的语法格式

类名::new

3.2 实例
@Test
public void t5(){
    // Lambda 方式调用无参构造器
    Supplier sup = () -> new Employee();
    System.out.println(sup.get());

    System.out.println("------------------------------------");

    // 构造器引用方式调用无参构造器
    Supplier sup2 = Employee::new;
    System.out.println(sup2.get());

    // 调用一个参数构造器
    Function fun = Employee::new;

    // 调用两个个参数构造器
    BiFunction fun2 = Employee::new;
}
4. 数组引用 4.1 简介

用于创建数组

语法格式

类型[]::new;

4.2 实例
@Test
public void t6() {
    // Lambda 方式
    Function funLambda = (args) -> new String[args];
    String[] strsLambda = funLambda.apply(50);
    System.out.println("Lambda : " + strsLambda.length);

    System.out.println("------------------------------------");

    // 数组引用方式
    Function func = String[]::new;
    String[] strArr = func.apply(100);
    System.out.println("arr  : " + strArr.length);
}
本文首发于凌风博客:Java 8 新特性之方法引用
作者:凌风

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72756.html

相关文章

  • Java核心技术教程整理,长期更

    以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总。 Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 Java基础篇 8张图带你轻松温习 Java 知识 Java父类强制转换子类原则 一张图搞清楚 Java 异常机制 通用唯一标识码UUID的介绍及使用 字符串...

    Anchorer 评论0 收藏0
  • Java8 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    摘要:欧阳思海继承接口后,又加了新的抽象方法,这个接口就不再是函数式接口默认方法在接口中添加了一个默认方法。总结在这篇文章中,我们讲了表达式方法引用函数式接口接口中的静态方法接口中的默认方法的使用。 今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的...

    isLishude 评论0 收藏0
  • 乐字节Java8核心特性实战方法引用

    摘要:大家好,我是乐字节的小乐,上一次我们说到了核心特性之函数式接口,接下来我们继续了解又一核心特性方法引用。方法引用是一种更简洁易懂的表达式。感谢光临阅读小乐的,敬请关注乐字节后续将继续讲述等前沿知识技术。 大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...

    lakeside 评论0 收藏0
  • 乐字节-Java8特性方法引用

    摘要:上一篇小乐介绍了新特性函数式接口,大家可以点击回顾。中引入方法引用新特性用于简化应用对象方法的调用,方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用是一种更简洁易懂的表达式。 上一篇小乐介绍了《Java8新特性-函数式接口》,大家可以点击回顾。这篇文章将接着介绍Java8新特性之方法引用。 Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是...

    Codeing_ls 评论0 收藏0
  • Java 8方法引用和Lambda表达式

    摘要:方法引用在之前只能进行值传递,方法是不能传递的。首先方法接受了一个类型的对象,方法是获取所有的文件,是用来存储筛选之后的元素,循环所有获得到的文件数组,然后调用中的方法来进行条件筛选,放入后返回。 方法引用: 在Java 8之前只能进行值传递,方法是不能传递的。如果你想调用一个方法你必须先获取到它所在的类的实例,然后再通过实例去调用这个方法,但是Java 8新增了方法引用这个新特性可以...

    legendmohe 评论0 收藏0

发表评论

0条评论

wudengzan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<