Как добавить фильтрацию в Stream API для выбора объектов с числом больше 1000?
Что проверяют
Базовое владение Stream API: промежуточные и терминальные операции, лямбды, типы. Решается одной строкой, поэтому следом просят усложнить: второе условие, сортировка, сумма, или спрашивают, когда стрим вообще начинает работать.
Как отвечать
Покажите решение на объектах, раз в вопросе речь про объекты:
List<Order> big = orders.stream().filter(o -> o.amount() > 1000).toList();
Дальше короткие пояснения:
filter: принимаетPredicate<T>и оставляет элементы, для которых он вернулtrue. Условия комбинируются черезand(),or(),negate()или&&в лямбде;- ленивость:
filterпромежуточная операция, до терминальной (toList(),collect,count,forEach) ничего не выполняется; toList()противcollect(Collectors.toList()): первый появился в Java 16 и возвращает неизменяемый список,addброситUnsupportedOperationException.Collectors.toList()изменяемость не гарантирует, на практике отдаётArrayList;- примитивы: если дальше нужна сумма, берите
mapToLong(Order::amount).filter(a -> a > 1000).sum()без упаковки вLong; - деньги: для
BigDecimalоператор>не скомпилируется, нуженcompareTo(BigDecimal.valueOf(1000)) > 0; - граница: уточните, «больше 1000» это
>или>=, и покажите тест на значении ровно 1000.
Условие, которое нужно в нескольких местах, вынесите в метод: filter(Order::isLarge) читается лучше лямбды.
Где спотыкаются
Забывают терминальную операцию и удивляются, что стрим ничего не вернул, а лямбда даже не вызвалась.
Ловят NullPointerException при распаковке null из List<Integer> или из поля объекта. Если такие значения возможны, отфильтруйте их заранее через Objects::nonNull.
Меняют результат toList() дальше по коду и получают исключение в рантайме, хотя компилятор ничего не сказал.