La secuencia de Java 8 maneja la misma parte (intersección) y la desduplicación de la colección List

Una nueva característica de Java 8-Stream se utiliza a menudo para procesar colecciones. No cambiará la estructura original de la colección. La ventaja es que el código de Stream será mucho más conciso que el uso de bucles for.

Este artículo habla principalmente sobre: ​​Obtener la intersección, la diferencia y la deduplicación de dos conjuntos de listas.

Uno, la intersección de dos conjuntos

Por ejemplo: busque estudiantes con el mismo nombre en dos clases

public class Student {
    
    
	
	private String studentNo;
	//名字
    private String studentName;
	
	public Student(String studentNo, String studentName) {
    
    
        this.studentNo = studentNo;
        this.studentName = studentName;
    }
	
	//对象的比较涉及到equals()的重写, 这里仅仅比较studentName是否相同
	@Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return studentName.equals(student.getStudentName());
    }
	
	// set()和get()方法均省略..
}

El alumno es una instancia de objeto. Lo que queremos comparar es si los nombres son iguales. Solo necesitamos reescribir el método equals ().

Encontrar intersección

@Test
public void test(){
    
    
	// 1班的学生
	List<Student> class01=new ArrayList<>();
    class01.add(new Student("1","小明"));
    class01.add(new Student("2","赵铁柱"));	
	
	// 2班的学生
	List<Student> class02=new ArrayList<>();
    class02.add(new Student("1","赵铁柱"));

	// 找两个班名字相同的同学(取交集),比较用的是重写的equals()
	List<Student> sameName=class01.stream().filter(class02::contains).collect(Collectors.toList());
	sameName.stream().forEach(student->System.out.println(student.getStudentName()+" "));
	
	//output : 赵铁柱
}    

Tenga en cuenta que:
(1) class01.stream().filter(class02::contains)el filtro () retendrá los resultados de expresión, contenido, hay una expresión de clase 1 y clase 2 el nombre de los mismos compañeros de clase

(2) forEach es recorrer la colección, en lugar del bucle for, el código es más conciso

(3) collect(Collectors.toList())、collect(Collectors.toSet())、collect(Collectors.toMap())Recopile los datos de Stream en colecciones como Lista, Mapa, Conjunto, etc.

En segundo lugar, el conjunto de diferencias

Resultado de salida: bc

@Test
public void test(){
    
    
	List<String> list01=Arrays.asList("a","b","c");
   	List<String> list02=Arrays.asList("a","e","f");
	
	//list01和list02的差集, 仅保留了 b,c
   	List<String> result=list01.stream().filter(word->!list02.contains(word)).collect(Collectors.toList());
   	result.stream().forEach(word->System.out.print(word+" "));
}

Tres, deduplicación

Resultado de salida: abc

List<String> list=Arrays.asList("a","b","c","a");
List<String> distinct=list.stream().distinct().collect(Collectors.toList());
distinct.stream().forEach(word->System.out.print(word+" ")); 

Se eliminó el carácter repetido "a".

Cuatro, list.stream () es el método de construcción

Algunos amigos pueden tener list.stream()algunas dudas. Es un método para construir Stream. El método para construir Stream es el siguiente:

(1) Crear Stream con colección

List<String> list=Arrays.asList("a","b","c");
//创建顺序流
Stream<String> stream=list.stream();
//创建并行流
Stream<String> parallelStream=list.parallelStream();

(2) Arrays.stream(array)Crear flujo con matriz

int[] array={
    
    1,2,3,4,5};
IntStream stream=Arrays.stream(array);

(3) Stream<T> of(T... values)Crear flujo con

Stream<Integer> stream=Stream.of(1,2,3,4,5);

Los tres anteriores se utilizan comúnmente iterate(),generate(), además , el último es para generar números aleatorios, y ambos métodos de construcción generan flujos infinitos (es decir, el número de elementos es infinito) .

Si el número de requisitos es limitado, debe usar de límite a límite, como:

Stream<Integer> stream=Stream.iterate(0,num->num+3).limit(10)

Impreso[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

Supongo que te gusta

Origin blog.csdn.net/qq_44384533/article/details/113883652
Recomendado
Clasificación