2016-10-20 12 views
12
val seq1 = sequenceOf(1, 2, 3) 
val seq2 = sequenceOf(5, 6, 7) 
sequenceOf(seq1, seq2).flatten().forEach { ... } 

है कि कैसे मैं अनुक्रम संयोजन कर रहा हूँ, लेकिन मैं, चिंता कर रहा हूँ कि यह वास्तव में तत्वों को कॉपी है जबकि सब मैं जरूरत पुनरावर्तक iterables से तत्वों का उपयोग करता है (seq1, seq2) मैं इसे दे दी है।Kotlin अनुक्रम संयोजन

क्या ऐसा कोई कार्य है? , यह एक दृश्य है कि आइटम पहले seq1 से और फिर लेता है उत्पन्न करता है जब seq1 खत्म, seq2 से:

उत्तर

16

आपका कोड अनुक्रम तत्वों नकल नहीं है, और 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 और Sequencehere के बीच अंतर के बारे में और जानें।