gpt4 book ai didi

lambda - 如何在 .kt 类中使用功能接口(interface)

转载 作者:行者123 更新时间:2023-12-02 13:36:28 27 4
gpt4 key购买 nike

我想在 java.util.function 中使用一些功能接口(interface)像 DoubleBinaryOperator 这样的包界面。

我可以在Java中使用它,如下所示:

public enum Operation {
PLUS("+", Double::sum),
MINUS("-", (x, y) -> x - y),
TIMES("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);

private final String symbol;
private final DoubleBinaryOperator op;

Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}

}

但它在 Kotlin 中对我不起作用,因为 Kotlin 无法推断参数的类型。
enum class Operation private constructor(private val symbol: String, private val op: DoubleBinaryOperator) {
PLUS("+", { x, y -> x + y }),
MINUS("-", { x, y -> x - y }),
TIMES("*", { x, y -> x * y }),
DIVIDE("/", { x, y -> x / y });

}

最佳答案

您可以使用以下语法实现您想要的(SAM 转换):

enum class Operation private constructor(private val symbol: String, private val op: DoubleBinaryOperator) {
PLUS("+", DoubleBinaryOperator { left, right -> left + right }),
...
}
请注意,这仅适用于实现 Java 接口(interface),如文档 here 所述。 .
编辑
为了扩展我在下面的评论,可以使用 Kotlin lambdas 代替功能接口(interface)(所谓的 SAM 转换) 仅限 从 Kotlin 调用 Java 代码时。这在纯 Kotlin 中是不允许的,因为您可以使用函数类型(例如 (Double, Double) -> Double 来模仿 DoubleBinaryOperator )。
例如,考虑以下 Java 类:
public class MyClass {
String append(String input, Supplier<String> supplier) {
return input.concat(supplier.get());
}
}
在 Kotlin 中,您可以像这样使用它:
val myClass = MyClass()

// Use case 1
myClass.append("something") {
"suffix"
}

// Use case 2
myClass.append("Something", Supplier { "suffix" })
请注意,我的 IDE 告诉我用例 2 有一个“冗余 SAM 构造器”。
现在,让我们重写 MyClass在 Kotlin :
class MyClass {
fun append(input: String, supplier: Supplier<String>): String {
return input + supplier.get()
}
}
如果我们不使用它更改代码,我们将收到用例 1 的编译错误:“Required Supplier, found () -> String”(这与您遇到的问题相同),因为无法完成 SAM 转换.但是,您可以通过使用 SAM 构造函数(即用例 2)“强制”它。

关于lambda - 如何在 .kt 类中使用功能接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458313/

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