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 :)
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
).