美文网首页
java stream list对象根据自定义方式去重

java stream list对象根据自定义方式去重

作者: 黑暗中冬眠的华仔 | 来源:发表于2020-11-10 15:59 被阅读0次

查看Users实体类

//根据users的name以及age去重
List<Users> uniq = objects.stream()
                .filter(CommonUtils.distinctByKey(s -> StringUtils.join(s.getName(), "-", s.getAge())))
                .collect(Collectors.toList());


/**
     * 函数式接口 LIST Object 属性去重;原理 使用了map.putIfAbsent方法的特性如果key不存在 设置成功并且返回上一次的值(上次一的为null) 如果key已经存在了;设置失败并且返回上一次的值(上一次的为true) ;返回true!=null  fliter之后会过滤掉
     *
     * @param keyExtractor
     * @param <T>
     *
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>(16);
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }


相关文章