Programación de flujo de nuevas funciones de Java 8

Resumen de transmisión y escenarios de uso

Resumen de la secuencia

Stream es diferente de InputStream y outputStream. Se utiliza para mejorar el iterador de recopilación para permitirle completar operaciones de agregación más eficientes (filtrado, clasificación, agrupamiento estadístico) u operaciones de datos a gran escala. Además, con stream y expresiones lambada. La eficiencia de la codificación después de las vacaciones ha mejorado enormemente y la legibilidad es más sólida.

Stream utiliza una forma intuitiva similar a consultar datos de una base de datos utilizando sentencias SQL para proporcionar una abstracción de alto nivel de las operaciones y expresiones de conjuntos de Java.

Antes de aprender a transmitir, debe tener cierta comprensión de las expresiones Lambda.

El siguiente ejemplo puede explicar lo que puede hacer Stream:

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-uDjczjF4-1599051678458) (/ Users / faro_z / Library / Application Support / typora- user-images / image-20200902144322581 .png)]

En el ejemplo anterior, se obtienen algunas bolas de plástico de colores como fuente de datos, y las rojas se filtran primero y se funden en triángulos aleatorios. Vuelva a filtrar y elimine los triángulos pequeños. Finalmente, calcule el perímetro de los gráficos restantes.

Como se muestra en la figura anterior, para el procesamiento de flujo, hay principalmente tres operaciones clave: creación de flujo, operación intermedia y operación de terminal.

En términos más concisos, es poner los elementos de la colección en la línea de montaje , y agregar condiciones en cada paso , filtrar algunos elementos y finalmente dejar los elementos que desee.

Proceso de operación de flujo

Para el procesamiento de secuencias, hay principalmente tres operaciones clave: creación de secuencias, operación intermedia y operación de terminal.

  • Creación de flujo: es el método stream ().
  • Operaciones intermedias: operaciones de filtrado y clasificación
  • Operación final: saque e imprima estas operaciones

A continuación, se dará una introducción específica a estos tres tipos de operaciones.

Creación de flujo / fuente de canalización

Cambiar la colección a la fuente de la canalización es simple, flujo de llamadas

heros.stream();

Pero la matriz no tiene un método de flujo, debe usar

Arrays.stream(hs);

o

Stream.of(hs);

No confunda InputStream y OutputStream en las operaciones de E / S aquí. Los dos no son el mismo concepto.

Operación intermedia

Cada operación intermedia devolverá una secuencia. Por ejemplo, .filter () devuelve una secuencia. La operación intermedia es una operación "perezosa" y no se atravesará.
Hay muchas operaciones intermedias, divididas principalmente en dos categorías
, filtrando elementos y convirtiéndolos en otras formas de flujo

Elementos filtrantes:

filtrar coincidencias
distintas para eliminar duplicados (juzgando por iguales) // Nota: equals en Object juzga si es el mismo objeto, el siguiente es el código fuente de equals () en Object:

public boolean equals(Object obj)
{
     
     
	return this == obj;
}

Pero igual en String juzga si el contenido de la cadena es el mismo (por supuesto, si es el mismo objeto de cadena, devolverá verdadero)

ordenado Ordenado natural
ordenado (Comparador) Especifique el
límite de clasificación , siga
saltando e ignore

Convierta a otras formas de flujo:

mapToDouble convertido en flujo doble
similar a mapToInt (), mapToLong ()

El mapa se convierte a cualquier tipo de flujo.

package lambda;
  
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
import charactor.Hero;
  
public class TestAggregate {
    
    
  
    public static void main(String[] args) {
    
    
        Random r = new Random();
        List<Hero> heros = new ArrayList<Hero>();
        for (int i = 0; i < 5; i++) {
    
    
            heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
        }
        //制造一个重复数据
        heros.add(heros.get(0));
        System.out.println("初始化集合后的数据 (最后一个数据重复):");
        System.out.println(heros);
        System.out.println("满足条件hp>100&&damage<50的数据");
          
        heros
            .stream()
            .filter(h->h.hp>100&&h.damage<50)
            .forEach(h->System.out.print(h));
          
        System.out.println("去除重复的数据,去除标准是看equals");
        heros
            .stream()
            .distinct()
            .forEach(h->System.out.print(h));
        System.out.println("按照血量排序");
        heros
            .stream()
            .sorted((h1,h2)->h1.hp>=h2.hp?1:-1)
            .forEach(h->System.out.print(h));
          
        System.out.println("保留3个");
        heros
            .stream()
            .limit(3)
            .forEach(h->System.out.print(h));
          
        System.out.println("忽略前3个");
        heros
            .stream()
            .skip(3)
            .forEach(h->System.out.print(h));
          
        System.out.println("转换为double的Stream");
        heros
            .stream()
          //这里虽然获取的是血量
          //但是操作的还是对象
            .mapToDouble(Hero::getHp)
            .forEach(h->System.out.println(h));
          
        System.out.println("转换任意类型的Stream");
        heros
            .stream()
            .map((h)-> h.name + " - " + h.hp + " - " + h.damage)
            .forEach(h->System.out.println(h));
          
    }
}

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-acom9UEy-1599051678462) (/ Users / faro_z / Library / Application Support / typora- user-images / image-20200902191427499 .png)]

Mira otro ejemplo

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream s = strings.stream()
  .filter(string -> string.length()<= 6)
  .map(String::length)
  .sorted()
  .limit(3)
  .distinct();

La siguiente figura muestra el proceso de cambio del objeto Stream

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-JPggVXPb-1599051678467) (/ Users / faro_z / Library / Application Support / typora- user-images / image-20200902193853184 .png)]

Operación final

El resultado de la operación intermedia de Stream sigue siendo un Stream, entonces, ¿cómo convertir un Stream al tipo que necesitamos? Por ejemplo, calcular el número de elementos de la ruta, reemplazar la ruta con un conjunto, etc. Esto requiere operación terminal

La operación final consume el flujo y produce un resultado final. En otras palabras, después de la operación final, la secuencia no se puede usar de nuevo, ni se puede usar ninguna operación intermedia, de lo contrario, se lanzará una excepción.
Las operaciones finales comunes son las siguientes:

forEach () atraviesa cada elemento
collect ()
toArray () se convierte en una matriz
min (Comparator) toma el elemento más pequeño
max (Comparator) toma el elemento más grande
count () se usa para contar el número de elementos en la secuencia
findFirst () el primer elemento

El siguiente es un ejemplo del uso de recopilar

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis");
strings  = strings
  .stream()
  .filter(string -> string.startsWith("Hollis"))
  .collect(Collectors.toList());
//找出以“Hollis”开头的元素
System.out.println(strings);
//Hollis, HollisChuang, Hollis666, Hollis

para resumir

Stream en Java es como una función de consulta de base de datos, que puede ayudarnos a escribir código más eficiente

Supongo que te gusta

Origin blog.csdn.net/weixin_44062380/article/details/108370326
Recomendado
Clasificación