distinct() ist eine von Stream in Java 8 bereitgestellte Methode. Sie gibt einen Stream zurück, der aus verschiedenen Elementen im Stream besteht. simply() verwendet die Methoden hashCode() und eqauls(), um unterschiedliche Elemente abzurufen.
Daher muss die Klasse, die dedupliziert werden muss, die Methoden hashCode() und equal() implementieren. Mit anderen Worten: Wir können bestimmte spezielle Anforderungen erfüllen, indem wir die benutzerdefinierten Methoden hashCode() und equal() überschreiben.
distinct()-Methode wird wie folgt deklariert:
Stream<T> distinct();
Weil die String-Klasse equal() und überschrieben hat hashCode()-Methode, damit Duplikate erfolgreich entfernt werden können.
@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(); }
Die Ergebnisse sind wie folgt:
#🎜🎜 # 1.2 Deduplizierung von EntitätsklassenlistenHinweis: Im Code verwenden wir die @Data-Annotation des Lombok-Plug-Ins, die die Methoden equal() und hashCode() automatisch überschreiben kann.Vor der Deduplizierung: AABBC
Nach der Deduplizierung: ABC
/** * 定义一个实体类 */ @Data public class Student { private String stuNo; private String name; }
@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)); }Die Ergebnisse sind wie folgt:
Vor der Deduplizierung: [{"stuNo": "001", "name": "Tom"},{ „stuNo“: „002“, „name“: „Mike“},{“stuNo“: „001“, „name“: „Tom“}]2. Gemäß Objekt in ListeNach der Deduplizierung: [{“stuNo“: „001 " ,"name": "Tom"}, {"stuNo": "002", "name": "Mike"}]
@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)); }
Vor der Deduplizierung:[{" stuNo" :"001", "name": "Tom"},{"stuNo": "001", "name": "Tom"}, {"stuNo": "003", "name": "Tom" }]Verwenden Sie es wie folgt: # 🎜🎜#distinctNach dem Entfernen von Duplikaten: [{"stuNo": "001", "name": "Tom"}, {"stuNo": "003", "name": "Tom"}] #🎜🎜 # Nach dem Entfernen von Duplikaten gemäß dem Namen: [{"stuNo": "001", "name": "Tom"}]
2.2 Durch die filter()-Methode#🎜🎜 ##🎜🎜 #Wir erstellen zunächst eine Methode als Parameter von Stream.filter(). Der Rückgabetyp ist Predicate. Das Prinzip besteht darin, zu bestimmen, ob ein Element zum Set hinzugefügt werden kann: #🎜🎜 #private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); }
@Test public void distinctByProperty2() 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)); // 这里我们将 distinctByKey() 方法作为 filter() 的参数,过滤掉那些不能加入到 set 的元素 studentList = studentList.stream().filter(distinctByKey(Student::getName)).collect(Collectors.toList()); out.print("根据名字去重后 :"); out.println(objectMapper.writeValueAsString(studentList)); }
uniqueNach der Deduplizierung:[{"stuNo":001" ,"name":Tom"},{"stuNo":003",name":Tom"}]
Nach dem Entfernen von Duplikaten basierend auf dem Name: [{"stuNo": "001", "name": "Tom"}]Das obige ist der detaillierte Inhalt vonWie verwende ich den Stream von Java 8, um die Listendeduplizierung zu implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!