Я читаю про потоки 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)
; немає ніяких причин писати споживач і присудок, який просто викликає інший подібний метод.
forEach()
та peek()
, може працювати лише за допомогою побічних ефектів; їх слід використовувати обережно. ”. Моє зауваження більше нагадувало, що peek
операцію (розроблену для цілей налагодження) не слід замінювати тим самим, що робиться всередині іншої операції, як map()
або filter()
.