Expression Lambda JDK 8 pour la déduplication de la liste Java

JDK 8 fournit des expressions Lambda pour la programmation en continu et fournit également un moyen simple de dédupliquer List.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 5, 5, 5, 6, 7);

List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctNumbers);//1, 2, 3, 4, 5, 6, 7

On constate que les expressions Lambda sont en effet dédupliquées. Mais que se passe-t-il si c'est pour dédupliquer les attributs d'un certain objet?
Par exemple:
nous avons un List<User>objet comme celui-ci, que devons-nous faire pour dédupliquer conditionnellement le nom de l'utilisateur?

List<User> distinctUsers = users.stream()
.distinct(User::getName)
.collect(Collectors.toList());

Mais malheureusement, distinct ne fournit pas de paramètres de construction pour le passage de paramètres conditionnels, il peut donc y avoir un moyen intelligent, qui consiste à définir d'abord un filtre:

 private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    
    
     Set<Object> seen = ConcurrentHashMap.newKeySet();
     return t -> seen.add(keyExtractor.apply(t));
 }

Ensuite, vous pouvez passer ce filtre dans le paramètre distinct

List<User> users = new LinkedList<>();
users.add(new User("Jim"));
users.add(new User("Jim"));
users.add(new User("Tom"));
users.add(new User("Leo"));

List<User> distinctUsers = users.stream()
        .filter(distinctByKey(User::getName))
        .collect(Collectors.toList());

System.out.println(distinctUsers);//[Jim, Tom, Leo]

Je suppose que tu aimes

Origine blog.csdn.net/JAYU_37/article/details/109805848
conseillé
Classement