Kotlin,针对Java Interop:懒惰集合的习惯类型?

针对Java互操作性时,应该使用什么类型的懒惰集合?

  • Sequence<T>对于Kotlin调用者来说是最有意义的,因为默认情况下扩展函数是惰性的,但是强制Java调用者处理Kotlin stdlib类型并手动转换序列迭代器(序列不能扩展迭代!
  • 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-jre8org.jetbrains.kotlin:kotlin-stdlib )。

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