Javas on väga selge, et kollektsioonid (collection) ja vood (stream) erinevad, kuna erinevad ka operatsioonid, mida nendega on võimalik teha. Kotlinis on levinud laiendusfunktsioonid ja standardteek pakub ise nii kollektsioonide (collection) kui ka järjendite (sequence) jaoks võrdlemisi sarnaseid meetodeid. Kuna kollektsioonidel on olemas mugavad funktsioonid enam levinud operatsioonide jaoks, siis on oht, et ununeb võimalus kasutada ka järjendeid.
Kotlini kollektsioonide erinevus järjenditest
Kutsudes kollektsioonidel välja funktsioone, nagu map()
või filter()
, luuakse tulemusena alati uus kollektsioon.
Seega kui elemente on palju ning kollektsiooni töötlemine asub pikas tsükklis, võib igal töötlemise sammul uue kollektsiooni loomine olla väga ebaefektiine.
Järjenditel puhul aga käivitatakse kogu defineeritud operatsioonide jada korraga ja alles lõpptulemus salvestatakse uude muutujasse.
Teine suur eelis järjenditel on see, et nende peal defineeritud operatsioonid kasutavad laiska väärtustamist - töödeldakse ainult neid elemente, mida on vastuse jaoks vaja. Kohe kui leitakse vastus, jäetakse edasine töötlemine pooleli. Kollektsioonide puhul aga töötlevad vahepealsed sammud alati igat element, isegi kui lõppvastuseks piisab esimesest tulemusest.
Kuidas kasutada
Kollektsiooni saab lihtsalt konverteerida järjendiks kasutades asSequence()
meetodit.
fun m(i: Int): Int {
print("m$i ")
return i
}
fun f(i: Int): Boolean {
print("f$i ")
return i % 2 == 0
}
listOf(1,2,3,4).asSequence().filter(::f).map(::m).toList()
Sarnaselt Java voogudele, peab viimaseks operatsiooniks olema lõpetav meetod, mis tagastab tulemuse.