2011-09-23 6 views
13

मेरे पास एक स्कैला फ़ंक्शन foo(bs : Stream[Bar]) : Bat है जिसे मुझे जावा कोड से कॉल करने की आवश्यकता है। मैं जावा में "बीएस" स्ट्रीम (Stream[Bar]) कैसे बना सकता हूं और आलसी रूप से इसकी बार ऑब्जेक्ट्स उत्पन्न करता हूं?जावा में स्कैला स्ट्रीम को तुरंत चालू और पॉप्युलेट कैसे करें?

+0

कहाँ कि धारा से आता है? क्या आपके पास जावा संग्रह में है, क्या आप इसे ईवेंट के माध्यम से प्राप्त करेंगे, क्या? यह जानने के बिना, यह कहना असंभव है कि इसके बारे में सबसे अच्छा तरीका क्या होगा। –

+0

मेरी असली दुनिया की समस्या में, मेरे पास जावा वेक्टर है। मुझे यह समझने में दिलचस्पी होगी कि अगर किसी घटना से उत्पन्न होता है तो मैं कुछ अलग क्यों करूंगा। –

+0

आपकी समस्या के लिए @Travis उत्तर जाने का रास्ता है। किसी घटना से उत्पन्न करना अधिक कठिन होता है - एक अच्छा उदाहरण स्कैला की sys.process लाइब्रेरी है, जो चल रहे प्रक्रिया के 'आउटपुटस्ट्रीम' से' स्ट्रीम 'उत्पन्न कर सकता है। –

उत्तर

8

क्या धारा में होने की जरूरत है पर निर्भर करता है, यह एक java.util.Iterator बनाने और उसके बाद में बदलने के लिए सबसे आसान हो सकता है के माध्यम से एक Stream एक scala.collection.Iterator:

import scala.collection.JavaConverters; 
import scala.collection.immutable.Stream; 

... 

List<String> list = new ArrayList<String>(); 

\\ Fill the list somehow... 

Iterator<String> it = list.iterator(); 

Stream<String> stream = JavaConverters.asScalaIteratorConverter(it) 
             .asScala().toStream(); 

इटेटर को संग्रह से नहीं आना है, निश्चित रूप से-हम अपने स्वयं के इटरेटर को लागू करके आसानी से एक अनंत स्ट्रीम बना सकते हैं:

Stream<String> stream = JavaConverters.asScalaIteratorConverter(
    new Iterator<String>() { 
    int i = 0; 
    public boolean hasNext() { return true; } 
    public void remove() { throw new UnsupportedOperationException(); } 
    public String next() { return Integer.toString(i++); } 
    } 
).asScala().toStream(); 

यह Stream.iterate(0)(_ + 1).map(_.toString) जैसा कुछ नहीं है, लेकिन यह काम करता है।

+0

उपयोग करने में बहुत आसान है। धन्यवाद! –

0

आप

scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream() 

की कोशिश की है?

+0

मैंने यह स्पष्ट करने की कोशिश करने के लिए प्रश्न संपादित किया है कि मैं जावा-आधारित स्ट्रीम जनरेशन (केवल तात्कालिकता नहीं) का एक संपूर्ण उदाहरण ढूंढ रहा हूं –

10

Stream ऑब्जेक्ट साथी पर उपलब्ध कारखानों में से एक का उपयोग करने का सबसे अच्छा तरीका है। उनमें से सबसे उपयोगी के लिए, आपको Function1 को भी लागू करने की आवश्यकता होगी, जो AbstractFunction1 को बढ़ाकर किया जा सकता है।

यहाँ एक उदाहरण है:

import scala.collection.immutable.Stream; 
import scala.runtime.AbstractFunction1; 

public class Ex { 
    public Stream<Integer> stream = Stream.iterate(0, new Increment()); 
} 

class Increment extends AbstractFunction1<Integer, Integer> { 
    public Integer apply(Integer v1) { 
     return v1 + 1; 
    } 
} 
+0

मैंने @Travis के उत्तर को स्वीकार किया क्योंकि यह मेरी विशेष समस्या का सबसे सरल उत्तर है, लेकिन यह मामला अधिक सामान्य मामले के लिए बहुत उपयोगी है। –

संबंधित मुद्दे