Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda 如何在.kt类中使用函数接口_Lambda_Kotlin_Functional Interface - Fatal编程技术网

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()
    }
}