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

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

WBOY
Lepaskan: 2023-05-08 11:07:14
ke hadapan
2140 orang telah melayarinya

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

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

}
Salin selepas log masuk

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

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

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

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

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!

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