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]