2011-09-23 9 views
13

Ho una funzione Scala foo(bs : Stream[Bar]) : Bat che devo chiamare dal codice Java. Come posso creare il flusso "bs" (Stream[Bar]) in Java e generare generosamente i suoi oggetti Bar?Come istanziare e popolare un flusso Scala in Java?

+0

Da dove viene quel flusso viene? Ce l'hai in una Collezione Java, la riceverai attraverso l'evento, cosa? Senza saperlo, è impossibile affermare quale sarebbe la migliore soluzione al riguardo. –

+0

Nel mio problema del mondo reale, ho un vettore Java. Sarei interessato a capire cosa/perché farei qualcosa di diverso se fosse generato da un evento. –

+0

Per il tuo problema @Travis risposta è la strada da percorrere. Generare da un evento è più difficile - un buon esempio è la libreria sys.process di Scala, che può generare un 'Stream' dal' OutputStream' di un processo in esecuzione. –

risposta

8

A seconda di ciò che deve essere nel flusso, potrebbe essere più semplice per creare un java.util.Iterator e poi convertire ad un Stream tramite un 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(); 

Ovviamente l'iteratore non deve provenire da una raccolta: possiamo facilmente creare uno stream infinito implementando il nostro iteratore:

Non è bello come qualcosa come Stream.iterate(0)(_ + 1).map(_.toString), ma funziona.

+0

Molto facile da usare. Grazie! –

0

Hai provato

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

?

+0

Ho modificato la domanda per cercare di chiarire che sto cercando un esempio completo di generazione di stream basata su Java (non solo istanza) –

10

Il modo migliore è utilizzare uno degli stabilimenti disponibili su Stream companion di oggetti. Per il più utile, è necessario implementare anche lo Function1 estendendo il numero AbstractFunction1.

Ecco un esempio:

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

Ho accettato la risposta di @Travis perché è la risposta più semplice al mio particolare problema, ma questa risposta è molto utile per il caso più generale. –

Problemi correlati