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?
Respuesta
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.
Muy fácil de usar. ¡Gracias! –
Ha intentado
scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream()
?
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) –
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;
}
}
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. –
sé que estabas buscando corriente Scala, pero no es demasiado funcional java: http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Stream.html
- 1. ¿Cómo se traduce Stream-cons # :: en Scala?
- 2. ¿Diferencia entre Iterator y Stream en Scala?
- 3. Cómo crear un DSL interno en Scala?
- 4. Cómo crear anotaciones y obtenerlas en scala
- 5. Generar una clase a partir de cadenas y crear instancias en Scala 2.10
- 6. Tratamiento de un SQL ResultSet como un Scala Stream
- 7. Formas Zend - poblar() y setDefaults()
- 8. Miembros protegidos de otras instancias en Scala
- 9. Semántica de Scala Traversable, Iterable, Sequence, Stream y View?
- 10. Java Stream Keyboard Input
- 11. Cómo crear un mapa ordenado en scala?
- 12. Usar JNI para crear, poblar y devolver una instancia de clase Java
- 13. ¿Cómo crear y usar una matriz multidimensional en Scala?
- 14. Consumo de memoria de un Scala Stream paralelo
- 15. Cómo usar UINib para crear instancias y usar UITableViewCells personalizadas
- 16. Java: crear instancias de una enumeración utilizando la reflexión
- 17. Inline objeto de instancias y transformación en Java
- 18. ¿Cómo "bifurco" un Stream en .NET?
- 19. scala: creación de instancias de clases abstractas?
- 20. Cómo convertir System.Data.Linq.Binary en un Stream?
- 21. Cómo crear instancias de un elemento vacío con JAXB
- 22. ¿Cómo crear métodos no bloqueantes en Scala?
- 23. Comprimir y descomprimir un Stream con Compression.DeflateStream
- 24. WCF - Crear instancias de un objeto en DataContract constructor
- 25. ¿Aplicar un Regex en Stream?
- 26. Scala, Java y la igualdad
- 27. Cómo crear un proceso en Java
- 28. ¿Cómo construir tarea 'db: poblar'
- 29. Cómo crear un archivo exe en java
- 30. StreamReader y StreamWriter en el mismo Stream?
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. –
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. –
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. –