gpt4 book ai didi

java - 方法引用的组成

转载 作者:太空狗 更新时间:2023-10-29 22:45:16 24 4
gpt4 key购买 nike

这与这个问题有关:How to do function composition?

我注意到可以将方法引用分配给声明为 Function 的变量,因此我假设它应该有 andThencompose函数,因此我希望我们可以直接组合它们。但显然我们需要先将它们分配给声明为 Function 的变量(或在调用之前进行类型转换),然后才能调用 andThencompose在他们身上。

我怀疑我可能对这应该如何工作有一些误解。

所以我的问题:

  1. 为什么在调用 andThen 方法之前需要先进行类型转换或将其分配给变量?
  2. 需要以这种方式完成的方法引用的类型到底是什么?

示例代码如下。

public class MyMethods{
public static Integer triple(Integer a){return 3*a;}
public static Integer quadruple(Integer a){return 4*a;}

public int operate(int num, Function<Integer, Integer> f){
return f.apply(num);
}

public static void main(String[] args){
MyMethods methods = new MyMethods();
int three = methods.operate(1, MyMethods::triple); // This is fine
// Error below
// int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
// But this one is fine
Function<Integer, Integer> triple = MyMethods::triple;
Function<Integer, Integer> quadruple = MyMethods::quadruple;
int twelve = methods.operate(1, triple.andThen(quadruple));
// This one is also fine
int twelve2 = methods.operate(1, ((Function<Integer, Integer>)MyMethods::triple).andThen(MyMethods::quadruple));
}
}


关于错误的更多描述

在 Eclipse 中,它会突出显示错误消息:

The target type of this expression must be a functional interface

Eclipse error about functional interface

在 Java 8 编译器中错误是:

java8test.java:14: error: method reference not expected here        int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));                                         ^1 error

(其实为什么Eclipse和Java 8编译器的报错不一样?)

最佳答案

正如 Brian Goetz(Java lambda 项目负责人)所说,"Lambda expressions have no intrinsic type" (也适用于方法引用)。这就是为什么您需要在其方法可用之前强制转换(或分配)类型 Function

Eclipse 显示来自 JDK 编译器 (javac) 的不同错误消息的原因是 Eclipse 使用它自己的 Java 编译器,称为 ecj,这是一个与 javac 完全不同的程序。顺便说一句,这就是为什么 Eclipse 可以在 JRE 上运行,而不需要完整的 JDK 安装。

关于java - 方法引用的组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com