Kotlin,针对 Java 互操作 : Idiomatic type for lazy collection?

标签 kotlin lazy-evaluation kotlin-interop

当面向 Java 互操作时,惰性集合应该使用什么类型?

  • Sequence<T> 对 Kotlin 调用者最有意义,因为它的扩展函数默认是惰性的,但强制 Java 调用者处理 Kotlin 标准库类型并手动转换序列迭代器(序列不扩展可迭代!)
  • Iterable<T> 由于 for 循环中的隐式使用,对 Java 调用者来说是有意义的,但会导致毫无戒心的 Kotlin 调用者由于非惰性扩展函数而意外放弃惰性
  • Stream<T> 最适合 Java 和 Kotlin 调用者,但可能有开销,并且是 Java 8+(Kotlin 目标 6+)

最佳答案

您可以通过实现所有这三个来让每个人都开心。例如:

data class User(val name: String)

fun userSequence(): Sequence<User> = TODO()
fun usersLazily(): Iterable<User> = userSequence().asIterable()
fun userStream(): Stream<User> = userSequence().asStream()

通过不为这些函数中的任何一个使用像 users 这样的简单名称,您可以让调用者多思考一下他们​​真正想要的函数:

  • Kotlin 用户将使用 userSequence
  • Java 1.6 和 1.7 用户将使用 usersLazily
  • Java 1.8 用户将使用 userStream

userStream 必须在单独的 JAR 中定义,将 JDK 1.8 支持添加到您的 1.6/1.7 JAR(类似于 org.jetbrains.kotlin:kotlin-stdlib-jre8 code> 用于 org.jetbrains.kotlin:kotlin-stdlib)。

话虽如此,我会质疑您是否真的需要维护 Java 1.6 或 1.7 支持。如果你发现你没有,那么你可以把 userSequenceuserStream 放到同一个 JAR 中,甚至不定义 usersLazily

关于Kotlin,针对 Java 互操作 : Idiomatic type for lazy collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435437/

相关文章:

java - Google PubSub 异步速率限制无法按预期工作

java - Zip ByteArray 解压返回 null 但输入流有效

thread-safety - 将 'System.Lazy.LazyThreadSafetyMode' 与 MEF 一起使用

haskell - 解释这段输出素数流的haskell代码

java - 如何在 Kotlin 生成的 Java 代码中禁用 @NonNull/@Nullable 注释

google-maps - 如何放大设备的实际位置?

android - 在我的案例中,从后端刷新屏幕上显示的数据

haskell - 关于懒惰的困惑

java - 在 Kotlin 中实现 (/inherit/~extend) 注解

kotlin - 智能转换无法按预期运行