Kotlin,针对Java互操作:惰性收集的惯用类型?

F. *_*rge 7 lazy-evaluation kotlin kotlin-interop

在定位Java互操作时,应该使用什么类型的惰性集合?

  • Sequence<T> 对于Kotlin调用者来说最有意义,因为默认情况下它的延伸函数是懒惰的,但强制Java调用者处理Kotlin stdlib类型并手动转换序列迭代器(序列不会扩展迭代!)
  • Iterable<T> 由于for循环中的隐式使用,Java调用者有意义,但会导致毫无疑问的Kotlin调用者由于非延迟扩展函数而意外丢弃懒惰
  • Stream<T> 对于Java和Kotlin调用者来说都是最佳的,但可能有开销并且是Java 8+(Kotlin目标6+)

mfu*_*n26 2

通过实施这三项,您可以让每个人都满意。例如:

data class User(val name: String)

fun userSequence(): Sequence<User> = TODO()
fun usersLazily(): Iterable<User> = userSequence().asIterable()
fun userStream(): Stream<User> = userSequence().asStream()
Run Code Online (Sandbox Code Playgroud)

通过不使用像任何这些函数那样的简单名称,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 支持。如果您发现不这样做,那么您可以将userSequenceuserStream放入同一个 JAR 中,甚至不定义usersLazily.