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ı?
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ı?
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:
İşteval 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 Sequence
here arasındaki farklar hakkında daha fazla bilgi edinin.