Я проходил через Streams Video, когда я сбился с толку о том, как Streams API дает ленивую оценку по принципу императива для цикла.Java 8 - ленивая оценка?
Вот типичный для кода цикла, который проверяет первое число, которое больше трех и даже, затем просто распечатывает и возвращает.
List<Integer> arr = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9);
for (int i : arr) {
System.out.println(" Checking if is Greater: " + i);
if (i > 3) {
System.out.println("checking if is Even " + i);
if (i % 2 == 0) {
System.out.println(i * 2);
break;
}
}
}
Здесь ожидаемый выход:
Checking if is Greater: 1
Checking if is Greater: 2
Checking if is Greater: 3
Checking if is Greater: 5
Checking if is Even 5
Checking if is Greater: 4
Checking if is Even 4
8
Теперь вот тот же самый код, используя Streams API:
arr.stream()
.filter(Lazy::isGreater)
.filter(Lazy::isEven)
.map(Lazy::doubleIt)
.findFirst();
Это тоже оценивает тот же путь. Итак, как filter()
предоставляет что-то другое, которое мы не можем использовать с традиционными для петель?
Не должны ли ваши утверждения 'println' находиться внутри соответствующих блоков' if'? – Clashsoft
'filter' не предоставляет что-то другое, с которым вы не можете справиться для циклов. Это просто другой способ написания кода: императивный и функциональный. – Tunaki
Учитывая, что Java завершала работу с момента ее первого выпуска, как с чего-то с тех пор предоставлялось нечто, чего нельзя было сделать раньше? – Cephalopod