Я бы предложил аналогичный ernest_k ответ с Range
.
Но при таком подходе вы можете использовать обе коллекции для создания List<Range>
(этот "20"
может быть рассматривается как "20-20"
) и измените условие фильтра, чтобы использовать отрицание с помощью anyMatch
.
List<Range> ranges = Stream.concat(extensionsToExclude.stream(), rangesToExclude.stream())
.map(Range::creatRange).collect(Collectors.toList());
return directoryRecords.stream()
.filter(directoryRecord -> !ranges.stream()
.anyMatch(r -> r.isInRange(
Integer.parseInt(directoryRecord.getExtensionNumber()))
))
.collect(Collectors.toList());
class Range {
private int start;
private int end;
Range(String start, String end) {
this.start = Integer.parseInt(start);
this.end = Integer.parseInt(end);
}
static Range creatRange(String range) {
if (range.contains("-")) {
return new Range(range.split("-")[0], range.split("-")[1]);
}
return new Range(range, range);
}
boolean isInRange(int n) {
return start <= n && n <= end;
}
}
ОБНОВЛЕНИЕ
Создание List<Range> ranges
можно изменить, чтобы удалить точки из Set<String> extensionsToExclude
, которые находятся в диапазоне, созданном из List<String> rangesToExclud
. Тогда ненужные диапазоны не будут созданы.
List<Range> ranges = rangesToExclude.stream().map(Range::creatRange)
.collect(Collectors.toCollection(ArrayList::new));
extensionsToExclude.stream()
.filter(v -> !ranges.stream()
.anyMatch(r -> r.isInRange(Integer.parseInt(v))))
.map(Range::creatRange)
.forEach(ranges::add);