Colección para transmitir a una nueva colección

Estoy buscando la forma más fácil de filtrar una colección. Estoy pensando algo así como

Collection foo = existingCollection.stream().filter( ... ). ... 

Pero no estoy seguro de cómo es mejor pasar del filtro, a regresar o completar otra colección. La mayoría de los ejemplos parecen ser “y aquí puedes imprimir”. Posible que haya un constructor o método de salida que me falta.

Hay una razón por la cual la mayoría de los ejemplos evitan almacenar el resultado en una Collection . No es la forma recomendada de progtwigción. Ya tiene una Collection , la que proporciona los datos de origen y las colecciones no tienen utilidad por sí misma. Desea realizar ciertas operaciones en él, de modo que el caso ideal es realizar la operación utilizando la transmisión y omitir el almacenamiento de los datos en una Collection intermedia. Esto es lo que la mayoría de los ejemplos intentan sugerir.

Por supuesto, hay muchas API existentes que funcionan con Collection y siempre las habrá. Entonces Stream API ofrece diferentes formas de manejar la demanda de una Collection .

  • Obtenga una implementación de List arbitraria que contenga el resultado:

     List results = l.stream().filter(…).collect(Collectors.toList()); 
  • Obtenga una implementación de Set arbitraria que Set el resultado:

     Set results = l.stream().filter(…).collect(Collectors.toSet()); 
  • Obtener una Collection específica:

     ArrayList results = l.stream().filter(…).collect(Collectors.toCollection(ArrayList::new)); 
  • Agregar a una Collection existente:

     l.stream().filter(…).forEach(existing::add); 
  • Crear una matriz:

     String[] array=l.stream().filter(…).toArray(String[]::new); 
  • Use la matriz para crear una lista con un comportamiento específico específico (mutable, tamaño fijo):

     List al=Arrays.asList(l.stream().filter(…).toArray(String[]::new)); 
  • Permita que una secuencia compatible en paralelo se agregue a listas locales temporales y únete a ellas después:

     List results = l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll); 

    (Nota: esto está estrechamente relacionado con la forma en que se implementa actualmente Collectors.toList() , pero eso es un detalle de implementación, es decir, no hay garantía de que las implementaciones futuras de los toList() aún devuelvan una ArrayList )

Un ejemplo de la documentación de java.util.stream :

 Listresults = stream.filter(s -> pattern.matcher(s).matches()) .collect(Collectors.toList()); 

Collectors tiene un método toCollection() , sugiero mirar de esta manera.

Como un ejemplo que está más en línea con el estilo de progtwigción funcional Java 8:

 Collection a = Collections.emptyList(); List result = a.stream(). filter(s -> s.length() > 0). collect(Collectors.toList());