Stream takeWhile / dropWhile
Брать или пропускать элементы из Stream на основе предиката.
Сравнение кода
✕ Java 8
List<Integer> result = new ArrayList<>();
for (int n : sorted) {
if (n >= 100) break;
result.add(n);
}
// no stream equivalent in Java 8
✓ Java 9+
var result = sorted.stream()
.takeWhile(n -> n < 100)
.toList();
// or: .dropWhile(n -> n < 10)
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Оценка с коротким замыканием
Прекращает обработку, как только предикат не выполняется.
Совместимый с пайплайном
Естественно связывается с другими операциями Stream.
Декларативный
takeWhile читается как естественный язык: 'брать, пока меньше 100'.
Старый подход
Ручной цикл
Современный подход
takeWhile/dropWhile
Начиная с JDK
9
Сложность
Начинающий
Поддержка JDK
Stream takeWhile / dropWhile
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
takeWhile() возвращает элементы, пока предикат истинен, и останавливается при первом ложном значении. dropWhile() пропускает элементы, пока предикат истинен, и возвращает остальные. Оба лучше работают с упорядоченными Stream.
Связанная документация
Доказательство