Я читаю о потоках Java и открываю для себя новые вещи. Одна из новых вещей, которую я нашел, была peek()
функция. Почти все, что я читал в peek, говорит, что его следует использовать для отладки ваших потоков.
Что делать, если у меня был поток, где у каждой учетной записи есть имя пользователя, поле пароля и методы login () и loggedIn ().
у меня тоже есть
Consumer<Account> login = account -> account.login();
и
Predicate<Account> loggedIn = account -> account.loggedIn();
Почему это так плохо?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Теперь, насколько я могу судить, это именно то, что он должен делать. Это;
- Принимает список аккаунтов
- Пытается войти в каждую учетную запись
- Отфильтровывает любой аккаунт, который не вошел в систему
- Собирает зарегистрированные аккаунты в новый список
В чем недостаток того, чтобы делать что-то подобное? По какой причине я не должен продолжать? Наконец, если не это решение, то что?
Исходная версия этого использовала метод .filter () следующим образом;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
может быть операция, которую вы хотите, а не peek
. То, что он в API, не означает, что он не открыт для злоупотреблений (например Optional.of
).
.peek(Account::login)
и .filter(Account::loggedIn)
; нет причин писать Consumer and Predicate, который просто вызывает другой метод, подобный этому.
forEach()
и peek()
, может работать только через побочные эффекты; они должны использоваться с осторожностью. ». Мое замечание было больше напоминать, что peek
операцию (которая предназначена для целей отладки) не следует заменять, выполняя то же самое внутри другой операции, такой как map()
или filter()
.