1. 序章

Java 8の導入以来、多くの人々が(新しい)ストリーム機能を使い始めました。 もちろん、ストリーム操作が期待どおりに機能しない場合もあります。

IntelliJ には、通常のデバッグオプションに加えて、専用のストリームデバッグ機能があります。 この短いチュートリアルでは、この優れた機能について説明します。

2. ストリームトレースダイアログ

まず、[ストリームトレース]ダイアログを開く方法を示します。 デバッグウィンドウのツールバーには、 Trace Current Stream Chainアイコンがあります。これは、アプリケーションがストリームAPI呼び出し内のブレークポイントで一時停止した場合にのみ有効になります。

アイコンをクリックすると、[ストリームトレース]ダイアログが開きます。

ダイアログには2つのモードがあります。 最初の例ではフラットモードを見ていきます。 また、2番目の例では、デフォルトのモードである分割モードを示します。

3. 例

IntelliJにストリームデバッグ機能を導入したので、次はいくつかのコード例を使用します。

3.1. ソートされたストリームを使用した基本的な例

[ストリームトレース]ダイアログに慣れるための簡単なコードフラグメントから始めましょう。

int[] listOutputSorted = IntStream.of(-3, 10, -4, 1, 3)
  .sorted()
  .toArray();

最初は。 順序付けされていないintのストリームがあります。 次に、そのストリームを並べ替えて配列に変換します。

フラットモードでストリームトレースを表示すると、発生する手順の概要が表示されます。

左端に、最初のストリームが表示されます。 int は、私たちが書いた順序で含まれています。

最初の矢印のセットは、並べ替え後のすべての要素の新しい場所を示しています。 そして右端に、出力が表示されます。 すべてのアイテムがソートされた順序で表示されます。

基本を理解したので、次はもっと複雑な例を示します。

3.2. flatMapfilterの使用例

この次の例では、flatMapを使用します。 Stream.flatMap は、たとえば、オプションのリストを通常のリストに変換するのに役立ちます。 この次の例では、オプション顧客のリストから始めます。 次に、それを Customer のリストにマップし、フィルタリングを適用します。

List<Optional<Customer>> customers = Arrays.asList(
    Optional.of(new Customer("John P.", 15)),
    Optional.of(new Customer("Sarah M.", 78)),
    Optional.empty(),
    Optional.of(new Customer("Mary T.", 20)),
    Optional.empty(),
    Optional.of(new Customer("Florian G.", 89)),
    Optional.empty()
);

long numberOf65PlusCustomers = customers
  .stream()
  .flatMap(c -> c
    .map(Stream::of)
    .orElseGet(Stream::empty))
  .mapToInt(Customer::getAge)
  .filter(c -> c > 65)
  .count();

次に、分割モードでストリームトレースを表示します。これにより、このストリームの概要がわかりやすくなります。

左側に、入力ストリームが表示されます。 次に、オプションの顧客のストリームから実際の現在の顧客のストリームへのフラットマッピングを確認します。

その後、顧客の流れを年齢に合わせてマッピングします。

次のステップでは、年齢のストリームを65歳を超える年齢のストリームにフィルタリングします。

最後に、年齢の流れの中のアイテムの数を数えます。

4. 警告

上記の例では、[ストリームトレース]ダイアログによって提供される可能性のいくつかを見てきました。 ただし、注意すべき重要な詳細がいくつかあります。 それらのほとんどは、ストリームがどのように機能するかという直接的な結果です。

まず、ストリームは常にターミナル操作を実行する必要があります。 これは、[ストリームトレース]ダイアログを使用する場合も同じです。 また、ストリーム全体を消費しない操作(たとえば、 anyMatch )に注意する必要があります。 この場合、すべての要素が表示されるわけではなく、処理される要素のみが表示されます。

次に、ストリームが消費されることに注意してください Stream をその操作とは別に宣言すると、「Streamはすでに操作されているか閉じられています」というエラーが発生する可能性があります。 ストリームの宣言とその使用法を結合することで、このエラーを防ぐことができます。

5. 結論

このクイックチュートリアルでは、IntelliJのストリームトレースダイアログの使用方法を見てきました。

まず、並べ替えと収集を示す簡単なケースを見てみました。 次に、フラットマッピング、マッピング、フィルタリング、およびカウントを含む、より複雑なシナリオを検討しました。

最後に、ストリームデバッグ機能を使用しているときに遭遇する可能性のあるいくつかの警告を調べました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。