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;

    }

}
相关推荐
徐小黑ACG1 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
战族狼魂3 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
xyliiiiiL4 小时前
ZGC初步了解
java·jvm·算法
杉之5 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch5 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
bobz9656 小时前
k8s 怎么提供虚拟机更好
后端
bobz9656 小时前
nova compute 如何创建 ovs 端口
后端
天天向上杰6 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal
请来次降维打击!!!7 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
用键盘当武器的秋刀鱼7 小时前
springBoot统一响应类型3.5.1版本
java·spring boot·后端