List中对象去重和List 根据对象的属性去重

简介: 有这么一个需求,需要将从数据库查出来的数据进行去重。

有这么一个需求,需要将从数据库查出来的数据进行去重。

开发人员并没搞清楚用户是想按照对象去重还是要按照对象的属性去重。用户是希望按照对象的某个属性去重。因为有一列是时间按照对象去重相当于没去重。导致前台数据重复

第132行被注释掉的是按照对象去重

为了修复这个bug需要按照对象的属性(glassID)去重。

List中对象去重

** 重写对象的equals()方法和hashCode()方法

Person p1 = new Person(1l, "jack");
        Person p2 = new Person(3l, "jack chou");
        Person p3 = new Person(2l, "tom");
        Person p4 = new Person(4l, "hanson");
        Person p5 = new Person(5l, "胶布虫");
        List<Person> persons = Arrays.asList(p1, p2, p3, p4, p5, p5, p1, p2, p2);
        List<Person> personList = new ArrayList<>();
        // 去重
        persons.stream().forEach(
                p -> {
                    if (!personList.contains(p)) {
                        personList.add(p);
                    }
                }
        );
        System.out.println(personList);

List 的contains()方法底层实现使用对象的equals方法去比较的,其实重写equals()就好,但重写了equals最好将hashCode也重写了。

List 根据对象的属性去重

通过Comparator比较器,比较对象属性,相同就返回0,达到过滤的目的。

public static List<WppTegMeasureF> removeDupliById(List<WppTegMeasureF> wppTegMeasureF) {
    Set<WppTegMeasureF> personSet = new TreeSet<>((o1, o2) -> o1.getGlassId().compareTo(o2.getGlassId()));
    personSet.addAll(wppTegMeasureF);
    return new ArrayList<>(personSet);
  }

google的 List 根据对象的属性去重

import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
// 根据id去重
     List<Person> unique = persons.stream().collect(
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new)
        );

另外一种写法

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> map = new ConcurrentHashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
// remove duplicate
        persons.stream().filter(distinctByKey(p -> p.getId())).forEach(p -> System.out.println(p));


目录
相关文章
|
7月前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
303 0
|
2月前
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
383 7
|
4月前
|
TensorFlow 算法框架/工具 Python
从numpy,list对象创建
【8月更文挑战第12天】从numpy,list对象创建。
29 8
|
4月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
53 5
|
6月前
|
前端开发 开发者
CSS列表属性:list-style系列属性详解
CSS列表属性:list-style系列属性详解
344 40
|
6月前
|
Java
Java list中的对象转为list,list中的对象转为map
Java list中的对象转为list,list中的对象转为map
145 1
|
7月前
|
Java
Java使用List去重的四中方式
Java使用List去重的四中方式
52 6
|
7月前
|
SQL Java
【SpringBoot】List<实体类>如何去重,单、多属性去重
【SpringBoot】List<实体类>如何去重,单、多属性去重
503 0
|
7月前
|
Java API
java 对象list 使用stream进行过滤
在Java中,你可以使用Stream API对对象列表进行过滤。假设你有一个`List<MyObject>`,并且你想根据某些条件过滤出特定的对象。以下是一个示例: ```java import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<MyObject> myObjects = ... // 初始化你的对象列表 List<MyObject> filter
378 1
|
7月前
|
Java
list集合 使用java8同一列表获取前一条的数据放到当前对象中
list集合 使用java8同一列表获取前一条的数据放到当前对象中