Próbuję przefiltrować zasób i wykluczyć niektóre elementy na podstawie pola. Do wykluczenia mam zestaw (który zawiera identyfikator, który należy wykluczyć) i listę (zawiera wiele zakresów identyfikatorów, które należy wykluczyć). Napisałem poniższą logikę i nie jestem zadowolony z logiki drugiego filtra. Czy jest lepszy sposób, aby to zrobić w Javie 8? Muszę zrobić to samo, aby uwzględnić również zakresy.
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());
Dzięki :)
java
lambda
java-8
java-stream
Yadvendra Rathore
źródło
źródło
Boolean
obiektów, gdy potrzebujesz tylkoboolean
wartości. Chociaż tutaj zmiennainclude
jest całkowicie przestarzała. Gdy tylko ewentualna zmiana jest odtrue
celufalse
, można wymienićinclude = false;
zreturn false;
jako końcowy wynik został ustalony już. Następniereturn include;
na końcu można zastąpićreturn true;
i usunąć deklarację zmiennej. A ponieważdirectoryRecord
nigdy nie zmienia się w pętli, możesz przenieśćInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
przed pętlą (i zmienićInteger
naint
).Odpowiedzi:
Zrobiłbym to z
Range
klasą niestandardową , na przykład:Co sprawi, że coś takiego będzie możliwe:
Osobiście uważam, że twój pierwszy filtr jest wystarczająco dobry, aby go zachować.
źródło
noneMatch
kiedy mówimyrangesToExclude
? I przypuszczam, że mogłoby być jeszcze bardziej eleganckie rozwiązanie zTreeSet<Range>
…Sugerowałbym podobną do odpowiedzi ernest_k z
Range
.Ale w tym podejściu możesz użyć obu kolekcji do utworzenia
List<Range>
("20"
można to potraktować jako"20-20"
) i zmienić warunek filtru, aby użyć negacjianyMatch
.AKTUALIZACJA
Utworzenie
List<Range> ranges
można zmienić, aby usunąć punkty,Set<String> extensionsToExclude
które znajdują się w utworzonym zakresieList<String> rangesToExclud
. Wówczas niepotrzebne zakresy nie zostaną utworzone.źródło
możesz zrobić wczesną przerwę, jeśli warunek zakresu jest prawdziwy, zamiast czekać na ocenę wszystkich wpisów.
w przeciwnym razie po prostu zwróć false po pętli for.
źródło