Промежуточные операции потока в Java
Промежуточная операция возвращает новый поток и описывает, что сделать с каждым элементом. Пока нет конечной команды, тело шага может даже не вызываться: цепочка лишь хранит план работы.
В map добавим печать номера элемента и умножение,
а конечный шаг намеренно не вызовем:
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> data = List.of(1, 2, 3);
var pending = data.stream().map(n -> {
System.out.println("map " + n);
return n * 10;
});
System.out.println("built");
}
}
В консоли появится только строка "built".
Сообщения "map …" не печатаются: цепочка
сохранена, но элементы еще не просили.
Шаги выполняются в том порядке, в котором они
записаны. Один и тот же набор команд дает разный
объем работы, если переставить filter и
map местами:
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(2, 3, 4, 5);
List<Integer> viaFilter = nums.stream()
.filter(n -> n >= 4)
.map(n -> n * 2)
.toList();
List<Integer> viaMap = nums.stream()
.map(n -> n * 2)
.filter(n -> n > 6)
.toList();
System.out.println(viaFilter);
System.out.println(viaMap);
}
}
Списки совпадают, но во втором случае map
сработал четыре раза. На длинной цепочке такая
перестановка заметно меняет объем работы.
Дан код:
var nums = List.of(1, 2, 3, 4, 5);
Сначала оставьте числа больше двух, затем прибавьте единицу и соберите список. Выведите его.
Для того же списка прибавьте единицу до отбора
по условию n > 2. Сравните результат
с предыдущей задачей.