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

Apakah kaedah untuk mengalih keluar objek pendua dalam java8

WBOY
Lepaskan: 2023-05-04 16:10:16
ke hadapan
3915 orang telah melayarinya

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;
}
Salin selepas log masuk

atau gunakan kaedah penulisan Java8:

List<String> unique = list.stream().distinct().collect(Collectors.toList());
Salin selepas log masuk

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;;
    }
}
Salin selepas log masuk

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;
    }
Salin selepas log masuk

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);
Salin selepas log masuk

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);
    }
Salin selepas log masuk

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)
        );
Salin selepas log masuk

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));
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan