Я намагаюся фільтрувати ресурс і виключати деякі елементи на основі поля. Щоб виключити, у мене є набір (який містить ідентифікатор, який потрібно виключити) та список (він містить безліч діапазонів ідентифікаторів, які потрібно виключити). Я написав нижченаведену логіку і мене не влаштовує логіка 2-го фільтра. Чи є кращий спосіб, як ми можемо це зробити з Java 8? Мені потрібно зробити те ж саме, що включає і діапазони.
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());
Дякую :)
Booleanоб'єкти, коли вам просто потрібнеbooleanзначення. Хоча тут зміннаincludeповністю застаріла. Коли тільки можлива зміна відtrueдоfalse, ви можете замінитиinclude = false;з ,return false;як кінцевий результат був визначений вже. Потім,return include;в кінці можна замінити,return true;а декларацію змінної видалити. А оскількиdirectoryRecordніколи не змінюється в циклі, ви можете переміститиInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());цикл до циклу (і змінити йогоIntegerнаint).