Charla sobre Stream en Java | Equipo JD

1. Introducción

inserte la descripción de la imagen aquí
La fabricación y manipulación de colecciones es fundamental en nuestro día a día en las tareas de programación. Cuando necesitamos agrupar o buscar una colección, necesitamos usar iteradores para operar en la colección, y cuando necesitamos procesar una gran cantidad de datos, para mejorar el rendimiento, necesitamos usar el procesamiento paralelo, tal procesamiento El método es muy complicado. Las secuencias pueden ayudar a los desarrolladores a ahorrar un tiempo valioso y facilitar todo lo anterior.
inserte la descripción de la imagen aquí

2 Introducción a la corriente

inserte la descripción de la imagen aquí

¿Qué es exactamente el flujo? Una breve definición es "una secuencia de elementos generados a partir de una fuente que admite operaciones de procesamiento de datos", y sigue un breve análisis de esta definición.

2.1 Apoyar las operaciones de procesamiento de datos

Las operaciones de procesamiento de datos de flujo son similares a las bases de datos que pueden especificar agrupaciones o búsquedas de manera declarativa, y son consistentes con la idea de programación funcional, como filtrar, mapear, reducir, buscar, unir, ordenar, etc. Estas operaciones de flujo se puede ejecutar en serie, también se puede ejecutar en paralelo.

2.2 fuente

La secuencia usará una fuente que proporciona datos. Hay tres formas de crear una secuencia de objetos. Una es crear una secuencia a partir de un objeto de colección:



List<Integer> list = Arrays.asList(111,222,333);
Stream<Integer> stream = list.stream();

Una es crear una secuencia a partir de una matriz:

IntStream stream = Arrays.stream(new int(){
    
    111,222,333});

Una es crear una secuencia mediante el método estático Stream.of(), y la capa subyacente es Arrays.stream():

`Stream<Integer> stream = Stream.of(111, 222, 333);`
Stream stream = Stream.of(111, 222, 333);

El orden original se conserva al generar un flujo a partir de una colección ordenada. Una secuencia generada a partir de una lista cuyos elementos están en el mismo orden que la lista.
También hay dos flujos especiales:

  • Flujo vacío: Stream.empty()
  • Flujo infinito: Stream.genarate()

2.3 Secuencia de elementos

Los flujos también pueden acceder a un conjunto de valores ordenados que contienen tipos de elementos específicos como colecciones, pero su propósito principal es diferente. El propósito principal de las colecciones es almacenar y acceder a elementos, y el propósito principal de los flujos es expresar cálculos.

3 corrientes de pensamiento

La idea de la transmisión es similar a la tubería en producción. Muchos modelos de transmisión devuelven una transmisión. Estos modelos solo son responsables de lo que deben hacer y no requieren espacio de memoria adicional para almacenar los resultados del procesamiento. Estos modelos de flujo se pueden vincular para formar una tubería grande. En este proceso, no prestamos atención a cómo se procesan los datos en los pasos intermedios, y solo necesitamos usar los resultados procesados ​​de toda la tubería. El siguiente código puede reflejar esta idea. En el código, tomamos las materias primas como ejemplo. Necesitamos filtrar los nombres de las dos primeras materias primas cuyo volumen es superior a 200.
El primero es la definición de la clase de mercancía:

public class Goods {
    
    
    private final String Name;
    private final Integer Volume;

    public Goods(String name, Integer volume) {
    
    
        Name = name;
        Volume = volume;
    }
    public String getName() {
    
    
        return Name;
    }
    public Integer getVolume() {
    
    
        return Volume;
    }
}

La siguiente es la definición de la colección de productos básicos:

List<Goods> goods = Arrays.asList(new Goods("土豆",10),
new Goods("冰箱",900),new Goods("办公椅",300));

A continuación, obtenga el resultado que queremos:

   List<String> twofoods = goods.stream()//获取流
    .filter(goods1 -> goods1.getVolume()>200)//筛选商品体积大于200的
    .map(Goods::getName)//获取商品名称
    .limit(2)//筛选头两个商品
    .collect(Collectors.toList());//将结果保存在list中

Desde este punto de vista, ¿no es mucho más conveniente usar flujos para manejar nuestras necesidades específicas que usar iteración de colección?

4 Características del procesamiento de flujo

  • sin datos almacenados
  • no cambia la fuente de datos
  • solo se puede usar una vez

Aquí usamos una clase de prueba StreamCharacteristic para verificar las características anteriores del procesamiento de flujo:

import org.springframework.util.Assert;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamCharacteristic {
    
    
    public void test1(){
    
    
        List<Integer> list = Arrays.asList(1,2,2,5,6,9);
        list.stream().distinct();
        System.out.println(list.size());
    }
    public void test2(){
    
    
        List<String> list = Arrays.asList("wms", "KA", "5.0");
        Stream<String> stream = list.stream();
        stream.forEach(System.out::println);
        stream.forEach(System.out::println);
    }
}

El resultado en test1() es 6. Aunque hemos realizado la operación de deduplicación distintiva() en el Stream generado por el objeto de lista, no afecta la lista de origen de datos.

En test2(), el método stream.forEach se llama dos veces para imprimir cada palabra.Cuando se realiza la segunda llamada, se lanza una excepción "java.lang.IllegalStateException": "la secuencia ya se ha operado o cerrado". Esto significa que la secuencia no almacena datos, la secuencia se ha consumido después del recorrido y no se puede reutilizar.

5 Operaciones de flujo y uso de flujos

La conexión de todas las operaciones de flujo se puede combinar en una tubería.La tubería tiene dos tipos de operaciones: operaciones intermedias y operaciones terminales.

Las operaciones intermedias comúnmente utilizadas de StreamAPI son: filtrar, mapear, limitar, ordenar, distinguir.
Las operaciones de terminal comúnmente utilizadas de StreamAPI son: forEach, Count, Collect.

Cuando se usan secuencias, se requieren principalmente tres elementos: una fuente de datos para ejecutar consultas, una cadena de operaciones intermedias para formar una canalización de secuencias y una operación terminal que pueda ejecutar la canalización y generar resultados.

La siguiente figura muestra todo el proceso de operación de la corriente:
inserte la descripción de la imagen aquí

6 Resumen
inserte la descripción de la imagen aquí

  • Una secuencia es una secuencia de elementos producidos a partir de una fuente que admite operaciones de procesamiento de datos.
  • La idea de flujo es similar a la línea de montaje en producción.
  • La secuencia no almacena datos, no cambia la fuente de datos y solo se puede cambiar una vez
  • Las operaciones de flujo se dividen principalmente en dos categorías: operaciones intermedias y operaciones terminales.

Supongo que te gusta

Origin blog.csdn.net/leader_song/article/details/131840806
Recomendado
Clasificación