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();
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
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; }
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"}]
@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"}]
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!