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);
}