当前位置: 首页 > 知识库问答 >
问题:

Java 8中的方法引用

佟和安
2023-03-14
public class Car {

    private int maxSpeed;

    public Car(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }
}

我们可以按以下方式对汽车列表进行排序:,

    Car carX = new Car(155);
    Car carY = new Car(140);

    List<Car> cars = new ArrayList<>();
    cars.add(carX);
    cars.add(carY);

    cars.sort(Comparator.comparing(Car::getMaxSpeed));

如果我们看到方法<代码>比较器的签名。比较,输入参数类型为函数

在上面的例子中,Car::getMaxSpeed如何转换为Function

  Function<Void, Integer> function = Car::getMaxSpeed;

共有3个答案

井浩思
2023-03-14
匿名用户

没有参数的成员函数实际上有一个隐藏参数,即此引用。形式为class name::memberFunction的方法引用始终为类实例使用函数类型的第一个参数,即实例的隐藏参数。因此,在汽车的情况下。getMaxSpeed(),在内部它与静态整数getMaxSpeed(Car-Car)具有相同的参数<因此,代码>汽车::getMaxSpeed将适合功能类型

采用一个参数的成员函数也会发生类似的情况——它们适合双函数的函数类型,第一个参数是类实例。

赏新知
2023-03-14

如果您想为不接受参数的方法创建方法引用,例如已经绑定到实例的方法,您应该使用供应商,而不是函数

Function<Car, Integer> f1 = Car::getMaxSpeed;

Car carx = new Car(42);
Supplier<Integer> f2 = carx::getMaxSpeed; 

在方法引用carX::getMaxSpeed中,函数的"隐式"this-参数已经绑定到carx,因此您只剩下一个无参数函数(顺便说一句,它不能在比较器中使用),在Java8中,无参数函数只是一个供应商

类似地,如果您有一个返回void的方法,那么您将得到一个Comsumer:

Consumer<Integer> f3 = carx::setMaxSpeed;
狄天逸
2023-03-14

那是因为getMaxSpeed方法是一个函数

即:

<Car, Integer> Comparator<Car> java.util.Comparator.comparing(
    Function<? super Car, ? extends Integer> keyExtractor
)

笔记

为了从Car的实例中引用getMaxSpeed::习惯用法,您必须声明一个带有签名的Car方法:getMaxSpeed(Car car)

 类似资料:
  • 主要内容:1 Java8 方法引用的介绍,2 Java8 方法引用的分类,3 Java8 方法引用:引用静态方法,4 Java8 方法引用:引用实例方法,5 Java8 方法引用:引用构造方法1 Java8 方法引用的介绍 Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。 2 Java8 方法引用

  • 本文向大家介绍使用Java8中的方法引用来引用实例方法,包括了使用Java8中的方法引用来引用实例方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式中的名称来调用/引用和现有方法。 语法 以下是在Java中引用实例方法的语法

  • 问题内容: 我想知道带有方法引用和功能接口的所有这些东西如何在较低级别上工作。最简单的例子是我们有一些列表 现在我们要使用Collections类对其进行排序,因此我们可以调用: 但是,如果我们定义自定义比较器,则可能类似于: 问题在于Collections.sort具有两个参数:List和Comparator。由于Comparator是功能性接口,因此可以用具有相同签名(参数和返回类型)的lam

  • 本文向大家介绍使用Java8中的方法引用来引用构造函数,包括了使用Java8中的方法引用来引用构造函数的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式来调用/引用以及现有方法的名称。除了实例和静态方法,您还可以使用new关键字

  • 我正在通过一个例子,它从与方法引用相关的当前目录中提取一个隐藏文件数组,如下所述 使用匿名内部类实现 使用方法参考实现 我的问题是接口只有一个抽象方法(),而实现accept-method-using-method-reference在类中使用的有效性如何。我了解到,只有当参数与抽象方法匹配时,我们才能应用方法引用,但是这里method有一个类型的参数,但是没有参数。你能解释一下它的有效性吗。

  • 我对方法引用在Java8中是如何工作的有些困惑。我编写了下面的代码段用于过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不理解->listFiles方法的方法签名是如何在这个代码段的选项2中工作的。 这是我在Java8文档中发现的

  • 我正在和Java8一起做项目,发现了一个我无法理解的情况。 我有这样的代码: 这段代码运行良好,但我可以使用方法引用重写它: 而这段代码没有编译,在方法引用中给出了不兼容的抛出类型*SomeException*。 IDEA还向我提供了错误

  • 本文向大家介绍Java8中的default方法详解,包括了Java8中的default方法详解的使用技巧和注意事项,需要的朋友参考一下 Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。 上面的代码显示了MyClass类实现了InterfacesA接口的saySomething()方法。现在我们为InterfacesA接口新增