Я пытаюсь отфильтровать ресурс и исключить некоторые элементы на основе поля. Для исключения у меня есть набор (который содержит идентификатор, который должен быть исключен) и список (он содержит несколько диапазонов идентификаторов, которые необходимо исключить). Я написал приведенную ниже логику, и меня не устраивает 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());
Спасибо :)
java
lambda
java-8
java-stream
Ядвендра Раторе
источник
источник
Boolean
объекты, когда вам просто нужноboolean
значение. Хотя здесь, переменнаяinclude
полностью устарела. Если единственное возможное изменение - отtrue
наfalse
, вы можете заменитьinclude = false;
на, такreturn false;
как конечный результат уже определен. Затемreturn include;
в конце можно заменитьreturn true;
и объявление переменной удалить. И посколькуdirectoryRecord
в цикле никогда не происходит изменений, вы можете переместитьInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
цикл перед циклом (и перейтиInteger
к немуint
).Ответы:
Я бы сделал это с пользовательским
Range
классом, что-то вроде:Что сделает что-то подобное возможным:
Я лично считаю ваш первый фильтр достаточно хорошим, чтобы его можно было сохранить как есть.
источник
noneMatch
когда мы говорим оrangesToExclude
? И я полагаю, что может быть еще более элегантное решение сTreeSet<Range>
…Я бы предложил аналогично ответу ernest_k с
Range
.Но в этом подходе вы можете использовать как коллекцию для создания
List<Range>
(это"20"
можно рассматривать как"20-20"
), так и изменить условие фильтра, чтобы использовать отрицание сanyMatch
.ОБНОВИТЬ
Создание
List<Range> ranges
можно изменить, чтобы удалить точки изSet<String> extensionsToExclude
диапазона, созданного изList<String> rangesToExclud
. Тогда ненужные диапазоны не будут созданы.источник
Вы можете сделать ранний перерыв, если условие диапазона истинно, вместо того, чтобы ждать оценки всех записей.
в противном случае просто верните false после цикла for.
источник