私はJavaストリームについて読んでいて、進むにつれて新しいものを発見しています。私が見つけた新しいものの1つはpeek()
機能でした。私がピークで読んだほとんどすべては、それをストリームのデバッグに使用する必要があると述べています。
各アカウントにユーザー名、パスワードフィールド、login()メソッドとlogsIn()メソッドが含まれるストリームがある場合はどうなりますか。
私も持っています
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)
。そのような別のメソッドを呼び出すだけのコンシューマーと述語を記述する理由はありません。
forEach()
およびpeek()
、副作用を介してのみ動作することができます。これらは注意して使用する必要があります。」。私の発言は、peek
(デバッグの目的で設計された)操作を、map()
またはのような別の操作内で同じことを実行することで置き換えるべきではないことを思い出させることfilter()
です。