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;

    }

}
相关推荐
bing_1584 分钟前
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
spring boot·后端·微服务
小臭希6 分钟前
Java——琐碎知识点一
java·开发语言
学c真好玩17 分钟前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
Asthenia041217 分钟前
GenericObjectPool——重用你的对象
后端
Piper蛋窝27 分钟前
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
后端
excel41 分钟前
招幕技术人员
前端·javascript·后端
盖世英雄酱581361 小时前
什么是MCP
后端·程序员
淋一遍下雨天1 小时前
Spark Streaming核心编程总结(四)
java·开发语言·数据库
琢磨先生David1 小时前
重构数字信任基石:Java 24 网络安全特性的全维度革新与未来防御体系构建
java·web安全·密码学
程序修理员2 小时前
技能点总结
java