2017-08-01 50 views
7

針對Java interop時,應該使用哪種類型的懶惰集合?Kotlin,針對Java interop:惰性集合的習慣類型?

  • Sequence<T>使得對科特林呼叫者由於它是默認懶惰的擴展功能,最有意義的,但部隊的Java呼叫者應對科特林STDLIB類型和轉換手動序列迭代器(順序不延長迭代!)
  • Iterable<T>有意義的Java調用者由於對循環隱含使用,反而會造成不知情的科特林呼叫者失手懶惰由於非延遲擴展功能
  • Stream<T>是最佳的Java和科特林呼叫者但可能有開銷並且是Java 8+(Kotlin目標6+)
+0

可能是你可以在'科特林()使用迭代用'someIterable.asSequence? –

+0

這個世界的工作,但如所述的那樣,留下了一個毫無防備的致電者意外地降低懶惰的可能性。這個問題更多的是方向圖書館的發展。 –

回答

2

你可以讓每個人都高興通過實現三個。例如: -

data class User(val name: String) 

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

由於不使用一個簡單的名稱,如users任何這些功能你讓來電者認爲只是其中一個他們真的需要一點額外的:

  • 科特林用戶會使用userSequence
  • Java 1.6和1.7用戶將使用usersLazily
  • Java 1.8用戶將使用userStream

userStream將在一個單獨的JAR添加到您的1.6/1.7 JAR JDK 1.8的支持(類似於org.jetbrains.kotlin:kotlin-stdlib-jre8怎麼做的org.jetbrains.kotlin:kotlin-stdlib)來定義。

雖這麼說,我會質疑你是否真的需要維護Java 1.6或1.7的支持。如果你發現你沒有,那麼你可以把userSequenceuserStream到同一個JAR,甚至沒有定義usersLazily

+0

有趣的方法,如果沒有其他想法,我會在一兩天內接受。 –