Heim  >  Artikel  >  Java  >  Wie verwende ich den Stream von Java 8, um die Listendeduplizierung zu implementieren?

Wie verwende ich den Stream von Java 8, um die Listendeduplizierung zu implementieren?

WBOY
WBOYnach vorne
2023-05-08 11:07:142061Durchsuche

1. Die „distinct()“-Methode von Stream

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

1.1 Für die Deduplizierung der String-Liste

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:

Vor der Deduplizierung: AABBC
Nach der Deduplizierung: ABC

#🎜🎜 # 1.2 Deduplizierung von Entitätsklassenlisten

Hinweis: Im Code verwenden wir die @Data-Annotation des Lombok-Plug-Ins, die die Methoden equal() und hashCode() automatisch überschreiben kann.

/**
* 定义一个实体类
*/  
@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“}]

Nach der Deduplizierung: [{“stuNo“: „001 " ,"name": "Tom"}, {"stuNo": "002", "name": "Mike"}]

2. Gemäß Objekt in Liste2.1 Erstellen Sie eine neue Liste

@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));
  }

Das Ergebnis ist wie folgt:

Vor der Deduplizierung:[{" stuNo" :"001", "name": "Tom"},{"stuNo": "001", "name": "Tom"}, {"stuNo": "003", "name": "Tom" }]

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));
}
Verwenden Sie es wie folgt: # 🎜🎜#
@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));
  }

Die Ergebnisse sind wie folgt:

Vor dem Entfernen von Duplikaten:[{"stuNo":"001" ,“name“: „Tom“},{“stuNo“ :“001“, „name“: „Tom“}, {“stuNo“: „003“, „name“: „Tom“}]

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen