Переписать код из Java 7 в Java 8

168
15 октября 2017, 21:09

Есть код (Java 7):

Set<Session> set = new HashSet<>();
for (Session session : this.sessions.values()) { // sessions -> HashMap<String, Session>
    if (session.isSavingRequired()) {
        session.setSavingRequired(false);
        set.add(session);
    }
}

Как переделать код выше в вариант java 8 ? Я пробовал так:

Set<Session> set = this.sessions.values()  
                   .stream()  
                   .filter(Session::isSavingRequired)  
                   .collect(Collectors.toSet());

Проблема в том, что в коде выше я пропускаю строку session.setSavingRequired(false); что не есть хорошо. Как сделать правильно?

Answer 1

Или так:

Set<Session> set = this.sessions.values()  
                   .stream()  
                   .filter(Session::isSavingRequired)
                   .peek(s -> s.setSavingRequired(false))
                   .collect(Collectors.toSet());
Answer 2

Не стоит применять потоки данных всегда и везде. Если алгоритм требует состояния, значит функциональный подход не для него.

Answer 3

Можно сделать следующим образом:

Set<Session> set = this.sessions.values()  
               .stream()  
               .filter(Session::isSavingRequired)
               .map(session -> {
                 session.setSavingRequired(false);
                 return session;
               })
               .collect(Collectors.toSet());
READ ALSO
Разница между способами клонирования

Разница между способами клонирования

Есть ли принципиальная разница между использованием superclone() и созданием нового объекта с помощью new?

177
Одна сессия, но разные ID. WebSocket Java &amp; JavaScript

Одна сессия, но разные ID. WebSocket Java & JavaScript

Пишу чат элементарныйЗапуская сервер - вижу, что количество сессий всегда равняется "1", сколько бы вкладок или браузеров я бы не открыл

247
Метод или операция не реализована

Метод или операция не реализована

Что значит "Метод или операция не реализована"? У меня в этом коде ошибка:

251