2017-08-01 10 views
7

Lorsque vous ciblez Java interop, quel type utiliser pour une collection paresseuse?Kotlin, ciblant Java interop: type idiomatique pour collection paresseuse?

  • Sequence<T> fait le plus de sens pour les appels Kotlin en raison de fonctions d'extension sur elle être paresseux par défaut, mais les forces Java appelants à traiter avec le type d'un Kotlin et convertir la séquence iterator manuellement (séquence ne dépasse pas itérables!)
  • Iterable<T> est logique pour Java appelants en raison de l'utilisation implicite pour les boucles, mais provoquera des appelants Kotlin sans méfiance de laisser tomber accidentellement la paresse due à l'extension non paresseux fonctions
  • Stream<T> est optimale pour les appelants Java et Kotlin mais peuvent avoir les frais généraux et est Java 8+ (Kotlin cible 6+)
+0

Peut-être pouvez-vous utiliser itérable avec 'someIterable.asSequence()' dans Kotlin? –

+0

Ce monde fonctionne, mais laisse - comme indiqué - la possibilité qu'un visiteur * sans méfiance * tombe accidentellement la paresse. Cette question est plus en direction du développement de la bibliothèque. –

Répondre

2

Vous pouvez rendre tout le monde heureux en mettant en œuvre tous les trois. par exemple .:

data class User(val name: String) 

fun userSequence(): Sequence<User> = TODO() 
fun usersLazily(): Iterable<User> = userSequence().asIterable() 
fun userStream(): Stream<User> = userSequence().asStream() 

En n'utilisant un nom simple comme users pour l'une de ces fonctions vous font penser à l'appelant juste un peu plus sur celui qu'ils veulent vraiment:

  • utilisateurs Kotlin utiliseront userSequence.
  • Les utilisateurs de Java 1.6 et 1.7 utiliseront usersLazily.
  • Les utilisateurs de Java 1.8 utiliseront userStream.

userStream devront être définies dans un fichier JAR séparé en ajoutant 1,8 JDK soutien à votre 1.6/1.7 JAR (similaire à la façon dont org.jetbrains.kotlin:kotlin-stdlib-jre8 fait pour org.jetbrains.kotlin:kotlin-stdlib). Cela dit, je voudrais savoir si vous avez vraiment besoin de maintenir le support de Java 1.6 ou 1.7. Si vous ne le trouvez pas, vous pouvez mettre userSequence et userStream dans le même JAR et ne pas même définir usersLazily.

+0

Approche intéressante, je l'accepterai dans un jour ou deux s'il n'y a pas d'autres idées. –