7

以 Java 互操作为目标时,惰性集合应该使用什么类型?

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

1 回答 1

2

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

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-jre8for 的方式org.jetbrains.kotlin:kotlin-stdlib)。

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

于 2017-08-02T20:45:39.767 回答