Изменение значения поля в функции карты Stream - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу изменить значение поля в Stream.Я пытаюсь изменить его в .map, но я получил ошибку компиляции

Синтаксическая ошибка на токене (ах), неуместные конструкции (ы)

поток:

user.getMenuAlertNotifications()
    .parallelStream()
    .filter(not -> not.getUser().getId()==userId &&
                   notificationList.getIds().contains(not.getId()))
    .map(not -> not.setRead(Boolean.TRUE) -> not)
    .forEach(not -> menuService.save(not));

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы не собираетесь преобразовывать Stream<MenuAlertNotification> в Stream<Boolean>, поэтому не используйте map, который должен быть невмешивающим , без сохранения состояния операция:

.filter(...)
.forEach(not -> {
    not.setRead(Boolean.TRUE);
    menuService.save(not);
});

На примечании стороны not содержит отрицательное замечание, которое некоторые могут найти странным или странным (я так и сделал).Я бы переименовал этот лямбда-аргумент в notification, хотя вы можете найти более короткий вариант.


Кстати, конструкция not -> not.set Read(Boolean.TRUE) -> not может быть преобразована в совершенно правильное выражение:

.<Consumer<MenuAlertNotification>>map(not -> n -> n.setRead(Boolean.TRUE))
0 голосов
/ 19 сентября 2018
.map(not -> {
    not.setRead(Boolean.TRUE);
    return not;
})

Я думаю, что peek имеет больше смысла в этом случае, поскольку вы возвращаете тот же элемент, хотя:

peek(not -> not.setRead(Boolean.TRUE))

Возможно, вы также можете просто использовать true вместо Boolean.TRUE.

Обратите внимание, что это может быть выполнено не для всех элементов в потоке (например, если оно замыкается на короткое замыкание, но будет для нефильтрованных элементов в потоке в вопросе, начиная с forEachявляется терминальной операцией).

Также Function, переданный map, должен быть не мешающим и без состояния , так что выследует убедиться, что метод setRead относится к этим вещам.

...