Kotlin, ориентированный на Java interop: Идиоматический тип для ленивой коллекции?

При настройке Java interop какой тип следует использовать для ленивой коллекции?

  • Sequence<T> имеет наибольший смысл для абонентов Kotlin из-за того, что по умолчанию функции расширения на нем ленивы, но заставляет вызывающих Java обрабатывать тип stdlib Kotlin и преобразовывать итератор последовательности вручную (последовательность не расширяет итерабельность!)
  • Iterable<T> имеет смысл для 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 .