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-jre8
为org.jetbrains.kotlin:kotlin-stdlib
)。
这样说,我会质疑你是否真的需要维护Java 1.6或1.7的支持。 如果你发现你没有,那么你可以把userSequence
和userStream
放到同一个JAR中,甚至不需要定义usersLazily
。