2016-03-28 4 views
5

के साथ कोटलिन अनंत अनुक्रम I आलसी मूल्यांकन के लिए उपयोग करने के लिए कोटलिन में अनंत अनुक्रम बनाने के बारे में उलझन में हैं।इटेटरेटर फ़ंक्शन

जावा में:

IntStream.iterate(0, i -> i + 2) 
    .limit(100) 
    .forEach(System.out::println); 

लेकिन दृश्यों और अधिक भ्रमित तो जावा धाराओं लगते हैं। अनुक्रम निर्माता बहुत डॉक भ्रामक के लिए यह कहते हैं:

/** 
* Given an [iterator] function constructs a [Sequence] that returns values through the [Iterator] 
* provided by that function. 
* The values are evaluated lazily, and the sequence is potentially infinite. 
*/ 

लेकिन मैं नहीं जानता कि क्या यह एक इटरेटर समारोह या कैसे एक बनाने के लिए से मतलब है।

Sequence { iterator(arrayOf<Int>()) } 
     .forEach { print(it) } 

मेरे पास यह संकलित है लेकिन स्पष्ट रूप से कुछ भी प्रिंट नहीं करता है। मुझे नहीं लगता कि मेरा इटरेटर फ़ंक्शन कोई समझ में आता है। यह एक ऐसा फ़ंक्शन चाहता है जो कोई तर्क नहीं लेता है और एक इटेटरेटर देता है, जो जावा .iterate फ़ंक्शन जैसा नहीं है। इटरेटर के पास एक कन्स्ट्रक्टर होता है जो एक सरणी लेता है, जो समझ में आता है अगर मेरे पास एक सरणी में काम करने के लिए डेटा सेट था लेकिन मैं नहीं करता। मैं अनंत अनुक्रम के साथ काम करना चाहता हूं।

कोई नहीं है .limit, इसलिए मैंने पहले एक .reduce जोड़ने की कोशिश की लेकिन .reduce के लिए तर्क और भी भ्रमित थे। मुझे लगता है कि एक होना चाहिए। लेकिन मुझे पता था कि यह काम नहीं कर रहा था इसलिए मैंने कोशिश नहीं की।

अगर कोई मुझे दिखाएगा कि लॉटलिन में उपरोक्त जावा कोड को कैसे कार्यान्वित किया जाए तो इससे बहुत मदद मिलेगी।

उत्तर

15

आप generateSequence कारखाने विधि का उपयोग कर सकते हैं:

generateSequence(0) { it + 2 }.forEach { println(it) } 

या सीमित मामले के लिए:

generateSequence(0) { it + 2 }.take(100).forEach { println(it) } 
संबंधित मुद्दे