Explicación detallada de Stream en Java

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.

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 filterse 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 booleanvalor 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() > 5se usa para filtrar cadenas cuya longitud es mayor que 5.

mapa

El método de mapeo mapse 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::lengthse utilizan para convertir cada objeto de cadena a su valor de longitud.

ordenado

El método sort sortedse 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 intvalor 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 distinctse 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 countparaDevuelve el número de elementos en el Stream, el longtipo 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 reducese 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

forEachEl 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). forEachEs 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 streamconvierte primero en un flujo Stream a través del método, y luego forEachcada 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.

Supongo que te gusta

Origin blog.csdn.net/weixin_52357829/article/details/131177398
Recomendado
Clasificación