Java利用lamda根据多个属性优雅地给List去重

2023-03-05 362点热度 0人点赞 0条评论

问题描述

有一个List,里面的元素有多个属性,我们需要根据里面的2个(或者多个)属性来对这个List去重。

实现方法

代码如下:

public static void main(String[] args) {
    List<SomeObject> list = new ArrayList<>();
    list.add(new SomeObject("abc", 100));
    list.add(new SomeObject("abc", 100));
    list.add(new SomeObject("def", 100));
    list.add(new SomeObject("def", 200));
    List<SomeObject> distinctedList = list.stream()
        // 把需要作为唯一值判断的条件的多个属性,组装成一个string,用这个string作为唯一值判断
        .filter(distinctByKey(p -> p.getName() + "_" + p.getPrice()))
        .collect(Collectors.toList()));
    
}

class SomeObject() {
    private final String name;
    private final Integer price;

    public SomeObject(String name, Integer price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public Integer getPrice() {
        return price;
    }

}

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> seen = new ConcurrentHashMap<>();
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

实现了一个distinctByKey返回一个Predicate,传入需要作为唯一值判断依据,使用list stream的filter来筛选。

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论