Прежде всего, вы должны спросить себя, действительно ли вам нужен List<Integer>
, для которого требуется бокс, или для вашей задачи будет достаточно массива int[]
.
Итак
int[] array = Arrays.stream(A)
.filter(c -> (c > -1001 && c < 1001))
.toArray();
будет гораздо эффективнее.Но если вам действительно нужен List<Integer>
, вы все равно должны сделать как можно больше работы перед упаковкой значений, то есть
List<Integer> arrayList = Arrays.stream(A)
.filter(c -> (c > -1001 && c < 1001))
.boxed()
.collect(Collectors.toList());
Таким образом, только соответствующие значения int
в штучной упаковке, а не все из них.Это оптимизация, которую реализация Stream не может выполнить сама, так как при использовании .boxed().filter(c -> (c > -1001 && c < 1001))
вы вызываете filter
для Stream<Integer>
, передавая Predicate<Integer>
вместо IntPredicate
, и реализация не имеет выборано для передачи Integer
этому коду.
Аналогичные вещи применимы к sort
;это намного эффективнее, когда применяется к данным примитивного типа, а не к Integer
объектам.Аналогичный потенциал есть у distinct
, но, на самом деле, это не материализуется с текущей реализацией.
Тогда вам придется самим реализовывать более совершенные алгоритмы, в этом и заключается проблема.
Одним из решений для поиска наименьшего положительного целого числа, не содержащегося в массиве, было бы
int first = Arrays.stream(A)
.filter(i -> i >= 0)
.collect(BitSet::new, BitSet::set, BitSet::or)
.nextClearBit(0);
Если «положительный» означает «больше нуля», вам придется использовать i > 0
и nextClearBit(1)
.Это решение также будет поддерживать параллельную обработку.
Изучение существующих алгоритмов и структур данных, предлагаемых Java API , является необходимостью для таких задач.А также знание того, что действительно не существует и должно быть реализовано вами самостоятельно.