Rumah  >  Artikel  >  Java  >  Apakah kaedah untuk mengalih keluar objek pendua dalam java8

Apakah kaedah untuk mengalih keluar objek pendua dalam java8

WBOY
WBOYke hadapan
2023-05-04 16:10:163880semak imbas

1. Alih keluar Rentetan pendua dalam Senarai

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

2 Alih keluar objek pendua dalam Senarai

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=&#39;" + name + &#39;\&#39;&#39; +
                &#39;}&#39;;
    }
}

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.

3. Deduplikasi berdasarkan atribut objek

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam