可以利用TreeSet與java8提供的stream filter對List進行去重
代碼:
public class TestRemoveDup {
/**
* TreeSet的本質是一個"有序的,並且沒有重複元素"的集合,它是通過TreeMap實現的。
* TreeSet注意事項:
* 如果向TreeSet集合中添加元素的時候,元素本身沒有具備自然順序的特性,並且元素所屬的類也沒有
* 實現Comparable接口,那麼必須在創建TreeSet對象的時候傳入一個比較器;
*/
//根據名字進行比較,相等時TreeSet會將該元素視爲重複元素,不允許添加;
private List<Person> removeDupByName(List<Person> people) {
Set<Person> personSet = new TreeSet<>(Comparator.comparing(Person::getName));
personSet.addAll(people);
return new ArrayList<>(personSet);
}
private List<Person> removeDupByName2(List<Person> people) {
List<Person> unique = people.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))), ArrayList::new)
);
return unique;
}
//filter的使用方式爲: filter(item -> item的邏輯判斷 ) ,其中filter會保留判斷條件爲true的記錄
private List<Person> removeDupByName3(List<Person> people) {
List<String> names = new ArrayList<>();//用來臨時存儲person的id
List<Person> personList = people.stream().filter(// 過濾去重
v -> {
boolean flag = !names.contains(v.getName());
names.add(v.getName());
return flag;
}
).collect(Collectors.toList());
return personList;
}
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
Person p1 = new Person("Liu",30);
people.add(p1);
Person p2 = new Person("Mi",36);
people.add(p2);
Person p3 = new Person("Liu",31);
people.add(p3);
TestRemoveDup testRemoveDup = new TestRemoveDup();
List<Person> people1 = testRemoveDup.removeDupByName(people);
List<Person> people2 = testRemoveDup.removeDupByName2(people);
List<Person> people3 = testRemoveDup.removeDupByName3(people);
System.out.println(people1);
System.out.println(people2);
System.out.println(people3);
}
}
結果:
[Person{name='Liu', age=30}, Person{name='Mi', age=36}]
[Person{name='Liu', age=30}, Person{name='Mi', age=36}]
[Person{name='Liu', age=30}, Person{name='Mi', age=36}]