2016-08-08 48 views
5

Ich verwende den folgenden Ausdruck, um eine Liste von Personen zu filtern, deren Geburtstag den Kriterien entspricht.So erfassen Sie die Liste der entfernten Elemente aus Java 8 Stream-Filterung?

Collectors.toList() gibt die Liste der Personen zurück, die den Kriterien entsprechen. Ich frage mich, wie ich die Liste der Personen erfassen kann, die zum Zweck der Fehlersuche/Protokollierung entfernt wurden. Eine Möglichkeit besteht darin, die Liste durch einen anderen Filter zu führen, aber das wird ineffizient sein. Können wir das im selben Filter tun?

+2

Nun, wenn Sie keine Elemente ou filtern möchten t, dann können Sie einfach abbilden, nach dem Ergebnis gruppieren und in zwei verschiedene Ausgangslisten reduzieren. – midor

Antwort

6

Ja, können Sie es in dem gleichen filter Telefonieren:

List<Person> matchingPeople = 
    people.stream() 
      .filter(p -> { 
       if (dateFilters.stream() 
          .anyMatch(df -> numOfDaysBetween(p.getBirthDate(), df.getDate()) < df.getDiffRange() 
)) 
       { 
        return true; 
       } else { 
        //you can add here code to log elements that don't pass the filter 
        //or you can add these elements to an external List 
        return false; 
       } 
      }) 
      .collect(Collectors.toList()); 

Eine weitere Alternative ist die Eingabeliste in zwei Listen auf dem Filter Prädikat zu partitionieren:

Map<Boolean, List<Person>> partition = 
    people.stream() 
      .collect(Collectors.partitioningBy(p -> <same code as in your filter method call>)); 
+0

Die Alternative ist sehr cool! Vielen Dank! – javakurious

0

Sie können einfach Entfernen Sie passende Personen aus Personen Sammlung:

people.removeAll(matchingPeople); 
+1

Dieser Ansatz kann sehr verwirrend werden, da er den Zustand der ursprünglichen Sammlung ändert - mit Vorsicht/Vorsicht/besser, aber überhaupt nicht. – Bwvolleyball