public List<String> removeStringListDupli(List<String> stringList) { Set<String> set = new LinkedHashSet<>(); set.addAll(stringList); stringList.clear(); stringList.addAll(set); return stringList; }
atau gunakan kaedah penulisan Java8:
List<String> unique = list.stream().distinct().collect(Collectors.toList());
Sebagai contoh, terdapat Orang kelas sekarang :
public class Person { private Long id; private String name; public Person(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
Tulis semula kaedah equals() dan kaedah hashCode() bagi objek Person:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (!id.equals(person.id)) return false; return name.equals(person.name); } @Override public int hashCode() { int result = id.hashCode(); result = 31 * result + name.hashCode(); return result; }
Kod deduplikasi objek berikut:
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);
The contains() kaedah Senarai Pelaksanaan asas menggunakan kaedah equals objek untuk membandingkan Sebenarnya, hanya mengatasi equals(), tetapi jika anda mengatasi equals, adalah lebih baik untuk menulis semula hashCode.
Seterusnya, kita perlu membuat penduaan berdasarkan id objek Person Bagaimana cara melakukannya?
Tulis kaedah:
public static List<Person> removeDupliById(List<Person> persons) { Set<Person> personSet = new TreeSet<>((o1, o2) -> o1.getId().compareTo(o2.getId())); personSet.addAll(persons); return new ArrayList<>(personSet); }
Bandingkan atribut objek melalui Comparator Jika ia sama, 0 akan dikembalikan untuk mencapai tujuan penapisan.
Mari kita lihat cara penulisan Java 8 yang hebat:
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) );
Ada cara penulisan lain:
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));
Atas ialah kandungan terperinci Apakah kaedah untuk mengalih keluar objek pendua dalam java8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!