通常情况下,实现列表去重的方式有:
- 创建一个新的result列表,循环原列表,如果元素不在result列表中,则放入
- 创建一个HashSet,将列表作为构造参数传入
下面介绍一种简单、高效的去重方式,借助于java8新特性引入的Stream类。代码如下:
实体类Person,如果id,name都相同,认为两个Person相同
package entity;
import java.util.Objects;
import lombok.Data;
@Data
public class Person {
private Integer id;
private String name;
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(id, person.id) &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
测试用例
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import entity.Person;
public class TestJava8 {
public static void main(String[] args) {
testCollectors();
}
static void testCollectors() {
System.out.println(Stream.of(1, 2, 3, 1, 2).distinct().collect(Collectors.toList()));
Person p1 = new Person(1, "a");
Person p2 = new Person(2, "b");
Person p3 = new Person(3, "a");
Person p4 = new Person(1, "c");
Person p5 = new Person(1, "a");
//将list转换为Stream,调用distinct方法,然后再讲Stream转换为list
System.out.println(Stream.of(p1, p2, p3, p4).distinct().collect(Collectors.toList()));
//输出结果为:[Person(id=1, name=a), Person(id=2, name=b), Person(id=3, name=a), Person(id=1, name=c)]
}
}