[解決済み] Javaストリームにおいて、peekは本当にデバッグのためだけなのでしょうか?
質問
Javaストリームについて調べているのですが、新しい発見があります。新しい発見のひとつは
peek()
という関数があります。私が読んだpeekに関するほとんどすべての本に、この関数はStreamsのデバッグに使うべきと書いてありました。
各アカウントにユーザー名とパスワードフィールドがあり、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();
})
解決方法は?
ここから得られる重要なポイント
たとえ目先の目的が達成されたとしても、意図しない方法でAPIを使わないこと。 そのやり方では将来壊れる可能性がありますし、将来のメンテナにとっても不明確です。
別個の操作なので、複数の操作に分割しても害はない。 そこで は これは、この特定の動作が将来のバージョンのJavaで修正された場合に影響を与える可能性があります。
使用方法
forEach
この操作で、メンテナには
意図した
の各要素に副作用が発生します。
accounts
そして、それを変異させることができる何らかの操作を実行していること。
という意味でも、よりコンベンショナルです。
peek
は、終端操作が実行されるまでコレクション全体に対して操作を行わない中間操作ですが
forEach
は確かに端末操作です。 このようにすると、もし
peek
と同じ挙動をします。
forEach
は、この文脈では
accounts.forEach(a -> a.login());
List<Account> loggedInAccounts = accounts.stream()
.filter(Account::loggedIn)
.collect(Collectors.toList());
関連
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Androidの開発でJava 8を使うことは可能ですか?
-
[解決済み] javaストリームで整数のリストを合計する方法は?
-
[解決済み] Java 8のストリーム内部からCHECKED例外を投げるにはどうすればよいですか?
-
[解決済み】Java 8 Streams: 複数のフィルタと複雑な条件の比較
-
[解決済み】なぜJava Streamsはワンスオフなのですか?
-
[解決済み] Java 8 Streams - コレクト vs リデュース
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Dateが型に解決できない問題を解決する
-
をインスタンス化することができません。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
サーブレットクラスのインスタンス化エラーの解決法
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
自動配線された依存性のインジェクションに失敗しました。