stream流-去重

针对基本数据类型集合

java 复制代码
public class DistinctDemo {



    public static void main(String[] args) {



        ArrayList<Integer> users = new ArrayList<>();

        users.add(1);

        users.add(2);

        users.add(127);

        users.add(127);

        users.add(128);

        users.add(128);

        users.add(-128);

        users.add(-128);

        users.add(-129);

        users.add(-129);



        users.stream().distinct().forEach(u -> System.out.println(u));

    }

}

针对对象集合

根据对象中的某一个成员变量进行去重

使用filter根据集合中对象的某个成员变量进行去重

java 复制代码
public class DistinctByVariableDemo {



    public static void main(String[] args) {



        ArrayList<User> users = new ArrayList<>();

        users.add(new User("小明", 1));

        users.add(new User("小力", 2));

        users.add(new User("小明", 3));

        users.add(new User("小为", 4));

        users.add(new User("小和", 5));



        users.stream().filter(distinctByVariable(Order::getOrderId)).

                forEach(fu -> System.out.println(fu.toString()));

    }



    /**

     * putIfAbsent() 方法是

     *      如果 key对应的value值不存在, key value 添加到 map 中,并返回 null

     *      如果 key对应的value值已存在, key value 不再添加到 map 中, 并返回原 value

     *

     * 故 newKey(这里的newKey对应user对象中的name的值), 如果(newKey, Boolean.TRUE) 在map中已存在,

     * putIfAbsent(newKey, Boolean.TRUE) 会返回 Boolean.TRUE (Boolean.TRUE 被final修饰,故其地址值唯一, 可用作比较)

     * 然后判断是否等于 null, 返回false, filter接收到结果为false的Predicate并将该值过滤掉

     * @param keyExtractor

     * @param <T>

     * @return

     */

    private static <T> Predicate<T> distinctByVariable(Function<? super T, ?> keyExtractor) {

        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();

        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;

    }

}
相关推荐
咖啡啡不加糖几秒前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu4 分钟前
java内存模型JMM
java·开发语言
大鸡腿同学24 分钟前
纳瓦尔宝典
后端
UFIT24 分钟前
NoSQL之redis哨兵
java·前端·算法
刘 大 望28 分钟前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
怀旧,34 分钟前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
大春儿的试验田1 小时前
Parameter ‘XXX‘ not found. Available parameters are [list, param1]
java
程序员JerrySUN2 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
2302_809798322 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器