Java基础 - stream流 - 去重

针对基本数据类型集合
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根据集合中对象的某个成员变量进行去重

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(u -> u.getName())).
                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) {
        HashMap<Object, Boolean> map = new HashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值