我正在阅读有关Java流的信息,并在不断学习中发现新事物。我发现的新peek()
功能之一就是功能。我偷看的几乎所有内容都说应将其用于调试Streams。
如果我有一个Stream,其中每个帐户都有一个用户名,密码字段以及一个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)
and .filter(Account::loggedIn)
; 没有理由写一个Consumer和Predicate只调用另一个这样的方法。
forEach()
和peek()
,只能通过副作用进行操作;这些应谨慎使用。”。我要特别提醒的是,该peek
操作(设计用于调试目的)不应由在另一操作(例如map()
或)内执行相同操作来代替filter()
。