En el flujo Stream, deduplicación basada en el objeto + el atributo en el objeto especificado

Primero defina una clase de estudiante:

@Data
@AllArgsConstructor
public class Student {
    
    

    private Long id;
    private String name;
    private Integer age;
    private Double high;
}

Construya cuatro objetos en el método principal, de los cuales el cuarto objeto es un objeto duplicado, y ahora realice la deduplicación de objetos y la deduplicación de cierto atributo en el objeto.

public class ListStreamDistinctTest {
    
    

    public static void main(String[] args) {
    
    
        // 一个集合中放入4个学生对象
        List<Student> list = new ArrayList<>();
        list.add(new Student(10002L, "ZhangSan", 18, 175.2));
        list.add(new Student(10001L, "LiSi", 19, 175.2));
        list.add(new Student(10004L, "Peter", 19, 170.8));
        list.add(new Student(10004L, "Peter", 19, 170.8));
	}
	  }

1. Deduplicación según el objeto:
en la función principal se escribe el siguiente código:

 System.out.println("整个对象去重:");
        list.stream().distinct()
        .forEach(System.out::println);

Los resultados de ejecución son los siguientes. Se puede ver que el distinto de la secuencia solo deduplica los objetos y deduplica los mismos objetos tercero y cuarto.
inserte la descripción de la imagen aquí
2. Deduplicación de acuerdo con un determinado atributo (edad) en el objeto:
método 1. Definir otros métodos:
El siguiente código está escrito en la función principal:

 System.out.println("指定age属性去重(方法一):");
        list.stream().filter(distinctByKey1(s -> s.getAge()))
          .forEach(System.out::println);

Defina un método estático aquí: distintoByKey1, escrito fuera de la función principal:

  static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {
    
    
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

resultado de la operación:
inserte la descripción de la imagen aquí

Método 2:
El siguiente código está escrito en la función principal:

 System.out.println("指定age属性去重(方法二):");
        TreeSet<Student> students = new TreeSet<>(Comparator.comparing(s -> s.getAge()));
        for (Student student : list) {
    
    
            students.add(student);
        }
        new ArrayList<>(students)
                .forEach(System.out::println);

Al construir un conjunto de árboles, recorrer la lista, agregar elementos al conjunto de árboles para completar la deduplicación y luego convertirlo en una Lista, el resultado de la ejecución:
inserte la descripción de la imagen aquí

Método 3:
El siguiente código está escrito en la función principal:

 System.out.println("指定age属性去重(方法三):");
        list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s -> s.getAge()))), ArrayList::new))
                .forEach(System.out::println);

Como variante del Método 2, el resultado de ejecución es:
inserte la descripción de la imagen aquí

Enlace de referencia:
Java8 stream-List deduplicación distinta y deduplicación de campos especificados

Supongo que te gusta

Origin blog.csdn.net/weixin_42260782/article/details/129826507
Recomendado
Clasificación