Lambda 如何在.kt类中使用函数接口
我想使用Lambda 如何在.kt类中使用函数接口,lambda,kotlin,functional-interface,Lambda,Kotlin,Functional Interface,我想使用java.util.function包中的一些函数接口,比如DoubleBinaryOperator接口 我可以在Java中使用它,如下所示: public enum Operation { PLUS("+", Double::sum), MINUS("-", (x, y) -> x - y), TIMES("*", (x, y) -> x * y), DIVIDE("/", (x, y) -> x / y); private
java.util.function
包中的一些函数接口,比如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接口
编辑
为了扩展我在下面的评论,当从Kotlin调用Java代码时,可以使用Kotlin lambdas代替函数接口(称为SAM转换)。这在纯Kotlin中是不允许的,因为您可以使用函数类型(例如,(Double,Double)->Double
,以模拟DoubleBinaryOperator
)
作为一个例子,考虑下面的java类:
public class MyClass {
String append(String input, Supplier<String> supplier) {
return input.concat(supplier.get());
}
}
注意,我的IDE告诉我用例2有一个“冗余SAM构造函数”
现在,让我们在Kotlin中重写MyClass
:
class MyClass {
fun append(input: String, supplier: Supplier<String>): String {
return input + supplier.get()
}
}
class-MyClass{
趣味附加(输入:字符串,供应商:供应商):字符串{
返回输入+供应商.get()
}
}
如果我们不使用它更改代码,我们将得到用例1的编译错误:“Required Supplier,found()->String”(这与您得到的问题相同),因为无法完成SAM转换。但是,您可以通过使用SAM构造函数(即用例2)来“强制”它。谢谢,但是为什么我需要显式地编写接口?问题是SAM转换(在需要函数接口的情况下使用lambdas)仅在从Kotlin调用Java代码时才起作用。在您的例子中,您正在Kotlin中定义
操作
,因此SAM转换不起作用,您需要显式地编写类型(称为SAM构造函数)。我的答案中的链接也解释了为什么SAM转换在这种情况下不起作用cases@IbrahimAli我更新了我的答案,添加了更多细节,希望现在更清楚
class MyClass {
fun append(input: String, supplier: Supplier<String>): String {
return input + supplier.get()
}
}