Ich versuche, eine Ressource zu filtern und einige Elemente basierend auf einem Feld auszuschließen. Zum Ausschließen habe ich einen Satz (der eine ID enthält, die ausgeschlossen werden muss) und eine Liste (die mehrere Bereiche von IDs enthält, die ausgeschlossen werden müssen). Ich habe die folgende Logik geschrieben und bin mit der 2. Filterlogik nicht zufrieden. Gibt es eine bessere Möglichkeit, dies mit Java 8 zu tun? Ich muss das Gleiche tun, um auch Bereiche einzuschließen.
Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900"));
List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000"));
return directoryRecords.stream()
.filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber()))
.filter((directoryRecord -> {
Boolean include = true;
for(String s : rangesToExclude) {
String [] rangeArray = s.split("-");
Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) {
include = false;
}
}
return include;
}))
.collect(Collectors.toList());
Vielen Dank :)
java
lambda
java-8
java-stream
Yadvendra Rathore
quelle
quelle
Boolean
Objekte, wenn Sie nur einenboolean
Wert benötigen . Hier ist die Variableinclude
jedoch völlig veraltet. Wenn die einzig mögliche Änderung von isttrue
zufalse
, können Sie ersetzeninclude = false;
mitreturn false;
als das Endergebnis bereits ermittelt wurde. Dann kann dasreturn include;
am Ende durch ersetztreturn true;
und die Variablendeklaration entfernt werden. Und dadirectoryRecord
nie in der Schleife ändert, können Sie die BewegungInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
vor der Schleife (und ändernInteger
zuint
).Antworten:
Ich würde es mit einer benutzerdefinierten
Range
Klasse machen, so etwas wie:Was so etwas möglich macht:
Ich persönlich finde Ihren ersten Filter gut genug, um so zu bleiben, wie er ist.
quelle
noneMatch
wenn wir darüber redenrangesToExclude
? Und ich nehme an, es könnte eine noch elegantere Lösung mit einemTreeSet<Range>
…Ich würde ähnlich wie ernest_ks Antwort mit vorschlagen
Range
.Bei diesem Ansatz können Sie jedoch sowohl eine Sammlung zum Erstellen
List<Range>
(dies"20"
kann als behandelt werden"20-20"
) als auch die Filterbedingung ändern, mit der die Negation verwendet werden sollanyMatch
.AKTUALISIEREN
Die Erstellung von
List<Range> ranges
kann geändert werden, um Punkte ausSet<String> extensionsToExclude
dem Bereich zu entfernen, aus dem erstellt wurdeList<String> rangesToExclud
. Dann werden keine unnötigen Bereiche erstellt.quelle
Sie können eine frühe Pause einlegen, wenn die Bereichsbedingung erfüllt ist, anstatt darauf zu warten, dass alle Einträge ausgewertet werden.
Andernfalls geben Sie nach der for-Schleife einfach false zurück.
quelle