Javaで.peekを使用してストリーム()ログがデバッグとみなされるであろう、デバッグ目的にのみ使用されるようにみなされていますか?

ジョナス:

だから私は、私は一部または全部を処理したいオブジェクトのリストを持っている、と私は、処理されたこれらのオブジェクトをログに記録したいと思います。

架空の例を考えてみます。

List<ClassInSchool> classes;
classes
.stream()
.filter(verifyClassInSixthGrade())
.filter(classHasNoClassRoom())
.peek(classInSchool -> log.debug("Processing classroom {} in sixth grade without classroom.", classInSchool)
.forEach(findMatchingClassRoomIfAvailable());

この例で.peekを()を使用しますが、APIの意図しない使用とみなされますか?

さらに説明するために、中にこの質問の鍵お持ち帰りです:「DOは、それはあなたの当面の目標を達成しても、意図しない方法でAPIを使用していません。」私の質問は、再び、意図しない使用で設計されており、(.peekを取り外して使用すると、チェーン全体の動作を確認するまで)、かどうか、あなたのストリームをデバッグするから短いPEEKのあらゆる使用されます。だから、実際にストリームによって処理すべてのオブジェクトをログに記録する手段としてそれを使用している場合は、意図しない使用と見なされます。

ホルガー:

ドキュメントはpeekとして意図を説明します

このメソッドを使用すると、彼らはパイプライン内の特定の点を越えて流れるよう要素を見たいサポートのデバッグ、主に存在します。

フォームの発現は.peek(classInSchool -> log.debug("Processing classroom {} in sixth grade without classroom.", classInSchool)、それが周りにあるように、これは意図満たす処理レポートエレメントのを。ロギングフレームワークを使用するか、単にドキュメントの例のように、ステートメントを印刷するかどうかは、問題ではありません.peek(e -> System.out.println("Filtered value: " + e))いずれの場合も、意思の問題ではなく、技術的なアプローチ。誰かが使用している場合peekする意図を持ってすべての要素を印刷し、それが(文書の例と同じ技術的なアプローチを使用していても、間違っているだろうSystem.out.println)。

ドキュメントは削除し、生産環境やデバッグ環境を区別する必要があることを強制しないpeek元の使用を。ロギングフレームワークを使用すると、設定可能なログレベルを経由して、そのアクションをミュートすることができますよう、実際にご利用にも、それを果たすだろう。

私はまだいくつかのパイプラインのために、挿入することを心に留めておくことをお勧めpeek操作すると、実際の操作よりも多くのオーバーヘッド挿入することができる(または、そのような程度にJVMのループ最適化を妨げます)。あなたは、パフォーマンスの問題が発生していない場合でも、あなたは本当の理由がない限り、最適化しようとしないように、古いアドバイスに従うことがあります...

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173449&siteId=1