List根据对象属性去重

615 阅读1分钟
//对象 
@Getter 
@Setter 
@Builder 
@NoArgsConstructor 
@AllArgsConstructor 
static class A { 
    String name; 
    Integer age; 
} 
ArrayList<A> objects = Lists.newArrayList(); 
objects.add(A.builder().name("1").age(1).build());
objects.add(A.builder().name("1").age(2).build()); 
objects.add(A.builder().name("2").age(1).build());

1.利用 TreeSet 的排序去重构造函数来达到去重元素的目的

objects.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(A::getName))), ArrayList::new));

2.list根据值去重,自定义去重规则

//去重规则, 不覆盖新对象 
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) { 
    Map<Object, Boolean> seen = new ConcurrentHashMap<>(); 
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; 
}
//去重
objects.stream().filter(distinctByKey(A::getName)).collect(Collectors.toList());