Java8 Lambda实现条件去重distinct List

Java8 Lambda实现条件去重distinct List

我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如:

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

但是, 如果我们有一个 List 类似这样的对象, 要对 User 的 name 进行条件去重怎么办?
我们想要的效果是这样的:

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

但是很遗憾, distinct()方法并不能设置条件. 解决方案如下:
首先定义一个过滤器:

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> seen = new ConcurrentHashMap<>();
    return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
}

然后就可以进行条件去重啦:

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]
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
java

java8-default方法

2023-2-3 9:42:43

java容器

tomcat的acceptCount、maxThreads、connectionTimeout参数调整

2023-3-1 10:56:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧