Java对象去重

    技术2022-07-11  80

    Java对象集合去重 重写对象类的equals和hashCode方法,然后使用Stream流的distinct()方法去重。

    代码如下:

    public static void main(String[] args) { List<Name> names = Arrays.asList(new Name(1, "tom", "man"), new Name(1, "tom", "female"), new Name(2, "tom", "man")); names.stream().distinct().forEach(System.out::println); List<Person> persons = Arrays.asList(new Person(1, "tom", "man"), new Person(1, "tom", "female"), new Person(2, "tom", "man")); persons.stream().distinct().forEach(System.out::println); } @Data @AllArgsConstructor @NoArgsConstructor static class Name{ private Integer id; private String name; private String addr; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Name name1 = (Name) o; return Objects.equals(id, name1.id) && Objects.equals(name, name1.name); } @Override public int hashCode() { return Objects.hash(id, name); } } /** * 自定义toString和Equal and HashCode方法 使用 @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true)继承父类的,否则lombok生成的是子类自身的属性对应的toString和Equal方法 */ @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) static class Person extends Name { public Person(Integer id, String name, String addr) { super.id = id; super.name = name; super.addr = addr; } }

    注:如果被排重对象类定义中有ID字段不能生效,可能是distinct方法有验证对象的ID字段。

    如果是某个字段去重,可以先把对象通过Stream流的map转成基本类型然后再使用distinct去重 如:

    public static void main(String[] args) { List<Name> names = Arrays.asList(new Name(1, "tom", "man"), new Name(1, "tom", "female"), new Name(2, "tom", "man")); names.stream().distinct().forEach(System.out::println); List<Person> persons = Arrays.asList(new Person(1, "tom", "man"), new Person(1, "tom", "female"), new Person(2, "tom", "man")); persons.stream().distinct().forEach(System.out::println); names.stream().map(Name::getName).distinct().forEach(System.out::println); }
    Processed: 0.012, SQL: 9