当前位置:  开发笔记 > 编程语言 > 正文

使用Kotlin高阶函数和单方法接口的行为?

如何解决《使用Kotlin高阶函数和单方法接口的行为?》经验,为你挑选了1个好方法。

我之前使用RxJava和Kotlin遇到了一些问题.我做了一些有趣的发现,我仍然感到困惑.

Func1RxJava中有简单的界面

public interface Func1 extends Function {
    R call(T t);
}

我试图添加一个扩展方法Observable,也是一个RxJava类.这会将排放物收集到Google Guava中,ImmutableListMulitmap使用a Func1来映射每个项目的关键字.

fun  Observable.toImmutableListMultimap(keyMapper: Func1): Observable> {
    return this.collect({ ImmutableListMultimap.builder()},{ b, t -> b.put(keyMapper.call(t), t)}).map { it.build() }
}

当我试图调用这个扩展方法时,我无法进行编译,而且根本不理解lambda表达式.

ScheduledItem.all.flatMap { it.rebuildSoftTransactions }
.toImmutableListMultimap { it.id /*compile error */ } .cache()

但是,当我修改扩展方法以使用函数类型时,最奇怪的事情发生了.

fun  Observable.toImmutableListMultimap(keyMapper: (T) -> K): Observable> {
    return this.collect({ ImmutableListMultimap.builder()},{ b, t -> b.put(keyMapper(t), t)}).map { it.build() }
}

然后一切编译得很好.但这让我感到困惑:为什么它没有将lambda推断到界面上?当我使用标准map()方法时,Observable它使用大括号{ }语法推断lambda就好了.但为什么它不适用于我上面的扩展方法?



1> yole..:

SAM转换(将lambda转换为函数类型)目前仅适用于用Java编写的方法.Kotlin具有适当的函数类型,因此不需要SAM转换 - 您可以直接将参数声明为函数类型(正如您所观察到的那样有效).

Observable.map()是用Java编写的,因此应用了SAM转换.您的扩展功能是用Kotlin编写的,所以不是.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有