Hoy, en el aprendizaje de Java, encontré el método de operación de starm. Después de entenderlo, descubrí que muchas operaciones son muy prácticas y se usan a menudo en el desarrollo de proyectos. Escribí este blog para grabar.
Tabla de contenido
1. Concepto básico de Stream
Stream es una nueva API introducida en Java 8, que puede facilitar enormemente nuestras operaciones continuas en fuentes de datos como colecciones y matrices. Simplifica nuestro código y lo hace más fácil de mantener y entender. Stream es en realidad un método de cálculo perezoso, y el cálculo solo comenzará cuando se necesite el resultado de salida.
Computación diferida en operaciones de flujo
Stream es solo un método de operación para los datos originales, y los datos en sí no han cambiado. Por lo tanto, cuando se opera en Stream, la instrucción de operación es en realidadalmacenado en el flujo de operaciónno se calcula ni ejecuta, y no se activará hasta que se requiera el resultado de salida. Este método puede reducir la cantidad de cálculos y gastos generales y mejorar la eficiencia.
Crear transmisión
Los flujos se pueden crear a partir de muchos tipos de fuentes de datos, como List, Set o cualquier otra clase que implemente la interfaz iterable. El método de creación es muy simple, solo use el método stream()
o parallelStream()
.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 串行Stream
Stream<String> parallelStream = list.parallelStream(); // 并行Stream
2. Métodos de operación de Stream comúnmente utilizados
Las operaciones de transmisión comúnmente utilizadas incluyen: filtrado, mapeo, clasificación, deduplicación, conteo, reducción, etc.
filtrar
El método de filtro filter
se utiliza para filtrar los elementos en el Streamfiltrar, conservando solo los elementos que cumplen los criterios especificados. Su interfaz funcional es Predicate<T>
, y su método es boolean test(T t)
, aceptando un objeto de tipo T y devolviendo un boolean
valor de tipo. Cuando el método devuelve true
, el elemento cumple las condiciones y se mantendrá en el Stream.
Por ejemplo el siguiente código:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<String> stream = list.stream().filter(s -> s.length() > 5);
La expresión lamdba que contiene s -> s.length() > 5
se usa para filtrar cadenas cuya longitud es mayor que 5.
mapa
El método de mapeo map
se usa para mapear los elementos en el Stream de acuerdo con las reglas especificadasconvertir. Su interfaz funcional es Function<T, R>
, y su método es R apply(T t)
, que acepta un objeto de tipo T y devuelve un objeto de tipo R. En esencia, el método map es hacer un mapeo del mismo tipo para cada elemento en el Stream.
Por ejemplo el siguiente código:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<Integer> stream = list.stream().map(String::length);
Las referencias a métodos que contiene String::length
se utilizan para convertir cada objeto de cadena a su valor de longitud.
ordenado
El método sort sorted
se usa para ordenar los elementos en el Streampara ordenar. Su interfaz funcional es Comparator<T>
, y su método es int compare(T o1, T o2)
, aceptando dos objetos de tipo T y devolviendo un int
valor de tipo. Cuando el valor de retorno es negativo, indica que o1 debe colocarse delante de o2; cuando el valor de retorno es positivo, indica que o1 debe colocarse detrás de o2; cuando el valor de retorno es 0, indica que el orden de o1 y o2 es incierto.
Por ejemplo el siguiente código:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<String> stream = list.stream().sorted();
Entre ellos, Stream utilizará la intercalación predeterminada para ordenar los elementos.
distinto
El método de deduplicación distinct
se utiliza para convertir el flujo enEliminación de elementos duplicados, quédate solo con uno. Utiliza el método de igualdad para la comparación, por lo que es necesario asegurarse de que los elementos en la fuente de datos implementen correctamente el método de igualdad.
Por ejemplo el siguiente código:
List<String> list = Arrays.asList("apple", "banana", "orange", "banana");
Stream<String> stream = list.stream().distinct();
Entre ellos, el elemento "banana" en Stream aparece dos veces, pero después de llamar al método distinto, solo se retiene una vez el elemento "banana".
contar
método de conteo count
paraDevuelve el número de elementos en el Stream, el long
tipo de valor devuelto.
Por ejemplo el siguiente código:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
long count = list.stream().count();
Entre ellos, el valor devuelto por el método count es 4, que es el número de elementos en el Stream.
reducir
El método de reducción reduce
se usa para reducir los elementos en el Stream a un valor. Su interfaz funcional es BinaryOperator<T>
, y su método es apply(T t1, T t2)
, que se utiliza para reducir dos valores tipo T y devolver un valor tipo T. El método reduce acepta dos parámetros: el primer parámetro representa el valor inicial de la operación de reducción, que puede ser cualquier tipo de objeto; el segundo parámetro es un objeto de tipo BinaryOperator, que se usa para reducir recursivamente todos los elementos en el Stream.
Por ejemplo el siguiente código:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, Integer::sum);
para cada
forEach
El método se utiliza para realizar la operación especificada en cada elemento del Stream, y su interfaz funcional es Consumer<T>
, y su método es void accept(T t)
. forEach
Es una operación de terminal, que solo se puede realizar una vez para el mismo Stream, una vez realizada la operación de terminal, el Stream no se puede reutilizar.
Por ejemplo el siguiente código:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(System.out::println);
Entre ellos, la colección se stream
convierte primero en un flujo Stream a través del método, y luego forEach
cada número entero se genera utilizando el método, y el resultado de salida final es:
1
2
3
4
5
3. Resumen
Stream es una API muy importante en Java 8, que puede facilitar enormemente nuestras operaciones continuas en fuentes de datos como listas y colecciones. Las operaciones de Stream pueden simplificar en gran medida nuestro código y mejorar la eficiencia, por lo que debemos ser competentes en el uso de Stream en la programación de Java. Debe tenerse en cuenta que cuando opere en Stream, debe prestar atención a la función de cálculo diferido de Stream para evitar una sobrecarga de cálculo innecesaria.