Primeiro defina uma classe de aluno:
@Data
@AllArgsConstructor
public class Student {
private Long id;
private String name;
private Integer age;
private Double high;
}
Construa quatro objetos no método principal, dos quais o quarto objeto é um objeto duplicado e agora execute a desduplicação de objetos e a desduplicação de um determinado atributo no 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. Desduplicação de acordo com o objeto:
o seguinte código é escrito na função principal:
System.out.println("整个对象去重:");
list.stream().distinct()
.forEach(System.out::println);
Os resultados da execução são os seguintes. Pode-se ver que o distinto do fluxo apenas desduplica os objetos e desduplica o mesmo terceiro e quarto objetos.
2. Deduplicação de acordo com um determinado atributo (idade) no objeto:
método 1. Definir outros métodos:
O código a seguir é escrito na função principal:
System.out.println("指定age属性去重(方法一):");
list.stream().filter(distinctByKey1(s -> s.getAge()))
.forEach(System.out::println);
Defina um método estático aqui: distinctByKey1, escrito fora da função 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 da operação:
Método 2:
O seguinte código é escrito na função 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);
Ao construir um treeset, percorrer a lista, adicionar elementos ao treeset para concluir a desduplicação e, em seguida, convertê-lo em uma lista, o resultado da execução:
Método 3:
O código a seguir é escrito na função 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 uma variante do Método 2, o resultado da execução é:
Link de referência:
desduplicação de lista de fluxo Java8 distinta e desduplicação de campos especificados