Stream对象去重
@Data
@Accessors(chain = true)
public class User {
private String id;
private String name;
private String bankNo;
@Test
public void testUnique() {
List<User> users = Lists.newArrayList(
new User().setId("1").setName("a").setBankNo("i"),
new User().setId("2").setName("b").setBankNo("ii"),
new User().setId("2").setName("b").setBankNo("iii")
);
List<User> unique1 = users.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getId))),
ArrayList::new)
);
System.out.println(unique1);
List<User> unique2 = users.stream()
.filter(distinctByKey(User::getId))
.collect(Collectors.toList());
System.out.println(unique2);
}
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
System.out.println("这个函数将应用到每一个item");
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
}