आपका कोड अनुक्रम तत्वों नकल नहीं है, और sequenceOf(seq1, seq2).flatten()
वास्तव में आप क्या चाहते हैं नहीं करता है।
इसके अलावा, ऑपरेटर +
वास्तव में इस तरह से कार्यान्वित किया जाता है, तो आप बस इसे उपयोग कर सकते हैं:
(seq1 + seq2).forEach { ... }
ऑपरेटर के स्रोत के रूप उम्मीद है:
public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> {
return sequenceOf(this, elements).flatten()
}
आप एक बार देख ले सकते हैं implementation of .flatten()
in stdlib पर FlatteningSequence
का उपयोग करता है, जो वास्तव में मूल अनुक्रमों 'iterators पर स्विच करता है। कार्यान्वयन समय के साथ बदल सकता है, लेकिन Sequence
जितना संभव हो उतना आलसी होना है, इसलिए आप इसे इसी तरह से व्यवहार करने की उम्मीद कर सकते हैं।
उदाहरण:
val a = generateSequence(0) { it + 1 }
val b = sequenceOf(1, 2, 3)
(a + b).take(3).forEach { println(it) }
यहाँ, पहले अनुक्रम को कॉपी सफल होने के लिए कभी नहीं कर सकते हैं क्योंकि यह अनंत है, और (a + b)
से अधिक पुनरावृत्ति आइटम a
से एक के बाद एक लेता है।
हालांकि, ध्यान दें कि .flatten()
Iterable
के लिए एक अलग तरीके से कार्यान्वित किया जाता है, और यह does तत्वों की प्रतिलिपि बनाएँ। Iterable
और Sequence
here के बीच अंतर के बारे में और जानें।