欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 方法引用的四种方式

程序员文章站 2022-05-19 11:16:19
使用 lambda 表达式创建匿名方法。然而,有时,lambda 表达式只能调用现有方法。在这些情况下,通过名称来引用现有的方法往往更为清楚。方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 ::一、方法引用的四种方式方式例引用静态方法ContainingClass::staticMethodName引用特定对象的实例方法containingObject::instanceMethodName...

使用 lambda 表达式创建匿名方法。然而,有时,lambda 表达式只能调用现有方法。在这些情况下,通过名称来引用现有的方法往往更为清楚。

  • 方法引用通过方法的名字来指向一个方法。

  • 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 方法引用使用一对冒号 ::

一、方法引用的四种方式

方式
引用静态方法 ContainingClass::staticMethodName
引用特定对象的实例方法 containingObject::instanceMethodName
引用特定类型的任意对象的实例方法 ContainingType::methodName
引用构造函数 ClassName::new

二、举例:

1、对象引用::实例方法名

public class PersonCompare {
    public int compareByName(Person a, Person b) {
        return a.getName().compareTo(b.getName());
    }
    public int compareByAge(Person a, Person b) {
        return a.getBirthday().compareTo(b.getBirthday());
    }
    @Test
    public void test(){
        Person[] pArr = new Person[]{
                new Person("1", LocalDate.of(2019, 12, 1)),
                new Person("2", LocalDate.of(2019, 12, 2)),
                new Person("3", LocalDate.of(2019, 12, 3)),
                new Person("4", LocalDate.of(2019, 12, 4))};
        PersonCompare personCompare = new PersonCompare();
        Arrays.sort(pArr, personCompare::compareByName);
    }
}

我们创建了一个PersonCompare对象,调用了其内部的compareByName实例方法。

2、类名::静态方法名

举几个例子:

  • String::valueOf,等价于 Lambda:s -> String.valueOf(s)
  • Math::pow 等价于lambda表达式 (x, y) -> Math.pow(x, y);
  • Person::compareByAge 就是一个静态方法引用,也是前面我们举得例子。
Function<Long, Long> f = Math::abs;
Long result = f.apply(-3L);123

Math是一个类而abs为该类的静态方法。Function中的唯一抽象方法apply方法参数列表与abs方法的参数列表相同,都是接收一个Long类型参数。

3、类名::实例方法名

若Lambda表达式的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,就可以使用这种方法:

BiPredicate<String, String> b = String::equals;
b.test("abc", "abcd");

String是一个类而equals为该类的定义的实例方法。BiPredicate中的唯一抽象方法test方法参数列表与equals方法的参数列表相同,都是接收两个String类型参数。

4、类名::new

在引用构造器的时候,构造器参数列表要与接口中抽象方法的参数列表一致。对应的 Lambda:() -> new String()。

class PersonFactory {
    private Supplier<Person> supplier;
    public PersonFactory(Supplier<Person> supplier) {
        this.supplier = supplier;
    }
    public Person getPerson() {
        return supplier.get();
    }
}
PersonFactory factory = new PersonFactory(Person::new);
Person p1 = factory.getPerson();

上面这段代码的功能就是使用PersonFactory工厂,然后使用Person::new创建一个Person实例。



参考 :

  • https://zhuanlan.zhihu.com/p/97165121
  • https://zq99299.github.io/java-tutorial/java/javaoo/methodreferences.html
  • https://www.runoob.com/java/java8-method-references.html

本文地址:https://blog.csdn.net/VariatioZbw/article/details/107374429

相关标签: Java java