java - que - ¿Cómo se realizan las funciones de Stream en un Iterable?
iterator java recorrer lista (4)
Esta pregunta ya tiene una respuesta aquí:
En Java 8, la clase Stream
no tiene ningún método para ajustar un Iterable
.
En cambio, estoy obteniendo el Spliterator
de Iterable
y luego StreamSupport
un Stream
desde StreamSupport
como este:
boolean parallel = true;
StreamSupport.stream(spliterator(), parallel)
.filter(Row::isEmpty)
.collect(Collectors.toList())
.forEach(this::deleteRow);
¿Hay alguna otra forma de generar operaciones de Stream
en un Iterable
que me falta?
Así es como agregaría la funcionalidad de flujo a un Iterable<T>
.
public interface StreamableIterable<T> extends Iterable<T> {
public default Stream<T> stream() {
final Stream.Builder<T> streamBuilder = Stream.builder();
forEach(t -> streamBuilder.add(t));
return streamBuilder.build();
}
}
No estoy seguro de si es la forma correcta, pero simplemente crea una secuencia de un Iterable
.
Sé que esto no responde directamente a su pregunta, pero un número decente de fuentes Iterable como las colecciones ahora tienen un método para obtener el objeto también como una secuencia.
Creo que la fricción con la que te encontrarás con esta pregunta es que Iterable es semánticamente serial, mientras que los Spliterators están destinados a ser utilizados para el procesamiento en paralelo. Probablemente sea una mejor idea implementar un Spliterator para la fuente de datos subyacente en la que esté interesado si no está ya provisto en el JDK porque el solo uso de un envoltorio alrededor de Iterable no le permitirá obtener los beneficios que proporciona la API de Stream. (como el procesamiento paralelo).
Mi pregunta similar se marcó como duplicada, pero aquí están los métodos de ayuda que he usado para evitar algunas de las repeticiones:
public static <T> Stream<T> stream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), false);
}
public static <T> Stream<T> parallelStream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), true);
}
Lo que describes es la forma de obtener una transmisión de un Iterable. Es por eso que agregaron el método spliterator () a Iterable. He hecho la misma conversión y no he visto otra manera.
[ACTUALIZAR] Tal vez esta otra respuesta arrojará alguna aclaración sobre el "por qué".