首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8高阶函数与Kotlin Lambdas互操作性

Java8高阶函数与Kotlin Lambdas互操作性
EN

Stack Overflow用户
提问于 2019-02-21 05:38:11
回答 2查看 540关注 0票数 2

我有一个Java示例,其中的方法实现为

代码语言:javascript
复制
@Override
public Function<ISeq<Item>, Double> fitness() {
    return items -> {
        final Item sum = items.stream().collect(Item.toSum());
        return sum._size <= _knapsackSize ? sum._value : 0;
    };
}

IntelliJ将其自动翻译为Kotlin是

代码语言:javascript
复制
override fun fitness(): Function<ISeq<Item>, Double> {
    return { items:ISeq<Item> ->
        val sum = items.stream().collect(Item.toSum())
        if (sum.size <= _knapsackSize) sum.value else 0.0
    }
}

(我明确了项的类型,并将return更改为0.0)

尽管如此,我仍然看到Java的函数和Kotlin原生lambda存在兼容性问题,但我对这些并不是最熟悉。错误是:

问题是:在这个示例中,是否可以在Kotlin中覆盖外部Java库的how ()方法?如果可以,如何覆盖?

EN

回答 2

Stack Overflow用户

发布于 2019-02-21 06:10:02

问题:

您将返回一个(Kotlin) lambda ISeq<Knapsack.Item> -> Double。但这不是你想要的。您想要返回一个Java Function<ISeq<Knapsack.Item>, Double>

解决方案:

您可以使用SAM Conversion创建Function

和Java8一样,

也支持转换。这意味着,只要接口方法的参数类型与Kotlin函数的参数类型匹配,就可以将Kotlin函数文字自动转换为具有单个非默认方法的Java接口实现。

我创建了一个最小的示例来演示这一点。假设您有一个Java类,如下所示:

代码语言:javascript
复制
public class Foo {
    public Function<String, Integer> getFunction() {
        return item -> Integer.valueOf(item);
    }
}

如果你想在Kotlin中覆盖getFunction,你可以这样做:

代码语言:javascript
复制
class Bar: Foo() {
    override fun getFunction(): Function<String, Int> {
        return Function {
            it.toInt()
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-02-21 06:04:25

当将lambda作为Java的函数接口返回时,您必须使用显式SAM构造函数:

代码语言:javascript
复制
override fun fitness(): Function<ISeq<Item>, Double> {
    return Function { items:ISeq<Item> ->
        val sum = items.stream().collect(Item.toSum())
        if (sum.size <= _knapsackSize) sum.value else 0.0
    }
}

另外,不要忘记导入java.util.function.Function,因为Kotlin有自己的同名类

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54795618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档