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 :)
Booleanobiektów, gdy potrzebujesz tylkobooleanwartości. Chociaż tutaj zmiennaincludejest całkowicie przestarzała. Gdy tylko ewentualna zmiana jest odtruecelufalse, 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żdirectoryRecordnigdy nie zmienia się w pętli, możesz przenieśćInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());przed pętlą (i zmienićIntegernaint).