【问题标题】:Kotlin, targeting Java interop: Idiomatic type for lazy collection?Kotlin,针对 Java 互操作:惰性收集的惯用类型?
【发布时间】:2018-01-08 04:18:57
【问题描述】:

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

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

【问题讨论】:

  • 也许您可以在 Kotlin 中将 iterable 与 someIterable.asSequence() 一起使用?
  • 这个世界正常工作,但留下了 - 如前所述 - 毫无戒心的调用者意外放弃懒惰的可能性。这个问题更倾向于图书馆的发展。

标签: kotlin lazy-evaluation kotlin-interop


【解决方案1】:

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

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

【讨论】:

  • 有趣的方法,如果没有其他想法,我会在一两天内接受。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2020-06-21
  • 2018-06-18
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多