Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan Java 8's Stream untuk melaksanakan penyahduplikasi senarai?

Bagaimana untuk menggunakan Java 8's Stream untuk melaksanakan penyahduplikasi senarai?

WBOY
WBOYke hadapan
2023-05-08 11:07:142115semak imbas

1. Kaedah distinct() bagi Stream

distinct() ialah kaedah yang disediakan oleh Stream dalam Java 8. Ia mengembalikan aliran yang terdiri daripada elemen berbeza dalam strim. distinct() menggunakan kaedah hashCode() dan eqauls() untuk mendapatkan elemen yang berbeza.

Oleh itu, kelas yang perlu dinyahduplikasi mesti melaksanakan kaedah hashCode() dan equals(). Dalam erti kata lain, kita boleh mencapai keperluan khas tertentu dengan mengatasi kaedah hashCode() dan equals() tersuai.

kaedah distinct() diisytiharkan seperti berikut:

Stream<T> distinct();

1.1 Untuk penduaan senarai String

Oleh kerana kelas String telah mengatasi kaedah equals() dan hashCode(), jadi Pendua boleh dialih keluar dengan jayanya.

@Test
public void listDistinctByStreamDistinct() {
  // 1. 对于 String 列表去重
  List<String> stringList = new ArrayList<String>() {{
    add("A");
    add("A");
    add("B");
    add("B");
    add("C");
  }};
  out.print("去重前:");
  for (String s : stringList) {
    out.print(s);
  }
  out.println();
  stringList = stringList.stream().distinct().collect(Collectors.toList());
  out.print("去重后:");
  for (String s : stringList) {
    out.print(s);
  }
  out.println();

}

Keputusannya adalah seperti berikut:

Sebelum penyahduplikasi: AABBC
Selepas penyahduplikasi: ABC

1.2 Penyahduaan senarai kelas entiti

Nota: Dalam kod, kami menggunakan anotasi @Data bagi pemalam Lombok, yang secara automatik boleh menggantikan kaedah equals() dan hashCode().

/**
* 定义一个实体类
*/  
@Data
public class Student {
  private String stuNo;
  private String name;
}
rrree

Keputusannya adalah seperti berikut:

Sebelum penduadua: [{"stuNo":"001","name":"Tom"},{"stuNo":" 002" ,"name":"Mike"},{"stuNo":"001","name":"Tom"}]
Selepas penyahduaan: [{"stuNo":"001","name": " Tom"},{"stuNo":"002","name":"Mike"}]

2 Alih keluar pendua berdasarkan atribut tertentu Objek dalam Lista87fdacec66f0909fc0757c19f2d2b1d

2.1 Buat senarai baharu

@Test
public void listDistinctByStreamDistinct() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    // 1. 对于 Student 列表去重
    List<Student> studentList = getStudentList();
    out.print("去重前:");
    out.println(objectMapper.writeValueAsString(studentList));
    studentList = studentList.stream().distinct().collect(Collectors.toList());
    out.print("去重后:");
    out.println(objectMapper.writeValueAsString(studentList));
  }

Hasilnya adalah seperti berikut:

Sebelum penyahduplikasi :[{"stuNo":"001","name":" Tom"},{" stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
Selepas penyahduaan yang berbeza: [{" stuNo":"001 ","name":"Tom"},{"stuNo":"003","name":"Tom"}]
Selepas mengalih keluar pendua berdasarkan nama: [{"stuNo" :"001","name ":"Tom"}]

2.2 Melalui kaedah penapis()

Kami mula-mula mencipta kaedah sebagai parameter Stream.filter() , dan jenis pulangannya ialah Predikat Prinsipnya adalah Untuk menentukan sama ada elemen boleh ditambah pada Set, kodnya adalah seperti berikut:

@Test
  public void distinctByProperty1() throws JsonProcessingException {
    // 这里第一种方法我们通过新创建一个只有不同元素列表来实现根据对象某个属性去重
    ObjectMapper objectMapper = new ObjectMapper();
    List<Student> studentList = getStudentList();
    out.print("去重前        :");
    out.println(objectMapper.writeValueAsString(studentList));
    studentList = studentList.stream().distinct().collect(Collectors.toList());
    out.print("distinct去重后:");
    out.println(objectMapper.writeValueAsString(studentList));
    // 这里我们引入了两个静态方法,以及通过 TreeSet<> 来达到获取不同元素的效果
    // 1. import static java.util.stream.Collectors.collectingAndThen;
    // 2. import static java.util.stream.Collectors.toCollection;
    studentList = studentList.stream().collect(
      collectingAndThen(
        toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList::new)
    );
    out.print("根据名字去重后 :");
    out.println(objectMapper.writeValueAsString(studentList));
  }

Gunakan seperti berikut:

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

Hasilnya ialah seperti berikut:

Sebelum penduaan :[{" stuNo":"001","name":"Tom"},{"stuNo":"001","name":"Tom" },{"stuNo":"003","name":"Tom" }]
Selepas penyahduaan yang berbeza: [{"stuNo":"001","name":"Tom"},{"stuNo" :"003","name":"Tom"}]
Selepas mengalih keluar pendua berdasarkan nama: [{"stuNo":"001","name":"Tom"}]

Atas ialah kandungan terperinci Bagaimana untuk menggunakan Java 8's Stream untuk melaksanakan penyahduplikasi senarai?. 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