2011-09-23 11 views
13

Tengo una función de Scala foo(bs : Stream[Bar]) : Bat que necesito llamar desde el código de Java. ¿Cómo creo el flujo "bs" (Stream[Bar]) en Java y genero perezosamente sus objetos Bar?¿Cómo crear instancias y poblar un Scala Stream en Java?

+0

dónde viene esa corriente viene? ¿Lo tienes en una Colección Java, lo obtendrás a través del evento, qué? Sin saber eso, es imposible afirmar cuál sería la mejor manera de hacerlo. –

+0

En mi problema del mundo real, tengo un Vector de Java. Me interesaría saber qué/por qué haría algo diferente si se generó a partir de un evento. –

+0

Para su problema, la respuesta de @Travis es el camino a seguir. Generar a partir de un evento es más difícil; un buen ejemplo es la biblioteca sys.process de Scala, que puede generar un 'Stream' a partir del' OutputStream' de un proceso en ejecución. –

Respuesta

8

Dependiendo de lo que se necesita para estar en la corriente, que podría ser más fácil de crear un java.util.Iterator y luego convertir a un Stream a través de 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(); 

El iterador no tiene que provenir de una colección, por supuesto, podemos crear fácilmente una secuencia infinita implementando nuestro propio iterador:

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(); 

No es tan bonito como algo como Stream.iterate(0)(_ + 1).map(_.toString), pero funciona.

+0

Muy fácil de usar. ¡Gracias! –

0

Ha intentado

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

?

+0

He editado la pregunta para intentar dejar en claro que estoy buscando un ejemplo completo de generación de flujo basado en Java (no solo creación de instancias) –

10

La mejor manera es usar una de las fábricas disponibles en Stream object companion. Para el más útil de ellos, deberá implementar Function1 también, lo que se puede hacer extendiendo AbstractFunction1.

He aquí un ejemplo:

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

Acepté la respuesta de @Travis porque es la respuesta más simple a mi problema en particular, pero esta respuesta es muy útil para el caso más general. –

Cuestiones relacionadas