Stream. map & peek - В чем различие

 
 
 
Сообщения:99
Взято из хабра:

peek - Возвращает тот же стрим, но применяет функцию к каждому элементу стрима
map - Преобразует каждый элемент стрима (т.е. тоже применяет функцию к каждому елементу стрима)

сюда же можно отнести forEach - Применяет функцию к каждому объекту стрима

В чем разница?
Изменен:12 янв 2018 08:31
 
 
Сообщения:820
peek и map вы описали. Разница между чем?
 
 
Сообщения:652
Hltr:
peek - Возвращает тот же стрим
Hltr:
map - Преобразует каждый элемент стрима

один преобразует, второй возвращает тот же стрим. Эта разница интересна была?

Я только учусь
 
 
Сообщения:99
Tachkin:
один преобразует, второй возвращает тот же стрим. Эта разница интересна была?

gidravlic:
peek и map вы описали. Разница между чем?


peek - применяет функцию к каждому елементу стрима, тем самьім преобразовьівая его
map - преобразовьівает каждьій елемент стрима, применяя функцию к каждому елементу стрима.

ну да..существенное отличие в чем я разобрался - то, что map не меняет сам стрим, а только его елементьі во время работьі над стримом.
А вот с forEach vs peek пока еще не очень вижу разницу
 
 
Сообщения:26
peek - предназначен только для дебага

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
Quote:
This method exists mainly to support debugging, where you want to see the elements as they flow past a certain point in a pipeline:


https://stackoverflow.com/questions/44370676/java-8-peek-vs-map
Изменен:13 янв 2018 07:17
 
 
Сообщения:99
QProgS:
This method exists mainly to support debugging, where you want to see the elements as they flow past a certain point in a pipeline:

трубопровод...

из всего, что находится по ссьілке на стековер, более-менее внятное вот ето:

"If you want to modify the existing objects, I think foreach is the better choice. – tobias_k Jun 5 '17 at 14:04"

но...WHY?!

вот следующее "обьяснение" толи использует не совсем удачньй пример, толи "льіжи не едут", но не понятно НИ ЧЕ ГО:


Suppose a trivial example first:

    List<Integer> list = new ArrayList<>();
    List<Integer> result = Stream.of(1, 2, 3, 4)
            .peek(x -> list.add(x))
            .map(x -> x * 2)
            .collect(Collectors.toList());

    System.out.println(list);
    System.out.println(result);


Everything looks fine right? Because peek will run for all elements in this case.
-- да, все вьіглядит чудесно, да peek применяется ко всем елементам из списка, как и ожидалось.

But what happens when you add a filter (and forget about what peek did):
--ну посмотрим, что же наделает peek.......

 .peek(x -> list.add(x))
 .map(x -> x * 2)
 .filter(x -> x > 8) // you have inserted a filter here


You are executing peek for every element, but collecting none. You sure you want that?

--что же произошло?...да вполне ожидаемьій результат, даже на мой нубский ум я его предусмотрел до компиляции кода
- list содержит 1, 2, 3, 4, т.к peek работает именно с ним
- result не содержит ничего, т.к. фильтр не пропустил ни одного из "подправленніх" чисел (все числа <= 8)

и какой вьівод из кода делать то?


На счет "дебажить".. Вот в етом и есть мой вопрос - в чем отличие дебага, используя peek от дебага, используя forEach?
 
 
Сообщения:820
Внимание! Не путайте терминальные и конвеерные методы. Терминальные заканчивают работу со стримом.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет