2016-10-20 55 views
12
I (, SEQ1 seq2) tek ihtiyacım Iterables elemanları kullanan bir yineleyici ise ben, aslında unsurları taklit ediyor o endişe ediyorum dizisi birleştirme yapıyor ama ben nasıl
val seq1 = sequenceOf(1, 2, 3) 
val seq2 = sequenceOf(5, 6, 7) 
sequenceOf(seq1, seq2).flatten().forEach { ... } 

ben verdim.Kotlin dizisi birleştirme

Böyle bir işlev var mı?

cevap

16
Kodunuz dizisi elemanlarını kopyalamaz

ve sequenceOf(seq1, seq2).flatten() aslında ne istediğinizi yapar: ilk seq1 den sonra öğeleri alır dizisi üretir, ne zaman seq2 dan seq1 bitirir.

Ayrıca, operatör + tam olarak bu şekilde uygulandığında, bu yüzden sadece bunu kullanabilirsiniz:

(seq1 + seq2).forEach { ... } 
operatörün kaynak beklendiği gibi

:

public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> { 
    return sequenceOf(this, elements).flatten() 
} 

Bir göz atabilirsiniz FlatteningSequence kullanan implementation of .flatten() in stdlib'da, orijinal dizilerin yineleyicileri üzerinde geçiş yapar. Uygulama zamanla değişebilir, ancak Sequence mümkün olduğunca tembel olmak üzere tasarlanmıştır, böylece benzer şekilde davranmasını bekleyebilirsiniz.

Örnek:

İşte
val a = generateSequence(0) { it + 1 } 
val b = sequenceOf(1, 2, 3) 

(a + b).take(3).forEach { println(it) } 

, sonsuz olduğundan başarılı olamaz ilk dizisini kopyalama ve (a + b) yineleme Eşyaları a teker teker sürer.


Ancak, .flatten()Iterable için farklı bir şekilde uygulanır ve bu unsurları kopyalamak does söyledi. Iterable ve Sequencehere arasındaki farklar hakkında daha fazla bilgi edinin.