Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java Stream API入門:ストリームの特徴と基本的な使い方を実例で解説

JavaのStream(ストリーム)は、データソースから取り出したオブジェクトのシーケンス(連続した列)を表し、集計操作(アグリゲート操作)をサポートする仕組みです。Java 8で導入されて以来、コレクション操作を簡潔かつ宣言的に記述できる手段として広く活用されています。

ここでは、Streamの主な特徴と、実際のコード例を通じてその使い方を解説します。

Streamの主な特徴

1. 要素のシーケンス

ストリームは、特定の型の要素を順番に提供します。要素は必要に応じて取得・計算され、ストリーム自体が要素を保存することはありません。

2. データソース

ストリームは、コレクション(Collections)、配列(Arrays)、I/Oリソースなどを入力ソースとして受け取ります。

3. 集計操作

filter、map、limit、reduce、find、matchなど、データを加工・抽出するための多彩な集計操作をサポートしています。

4. パイプライン処理

ストリーム操作の多くはストリーム自身を返すため、複数の処理をつなげてパイプライン化できます。これらは「中間操作」と呼ばれ、入力を受け取って処理し、その結果を次の処理へ渡す役割を担います。一方、collect()メソッドは「終端操作」であり、通常はパイプラインの最後に配置され、ストリーム処理の完了を示します。

5. 自動的な反復処理

従来のコレクションではfor文などによる明示的な反復処理が必要でしたが、ストリームではソース要素に対する反復処理が内部で自動的に行われます。これにより、コードがより簡潔になります。

サンプルコード①:TreeSetへの収集

まず、ストリームの要素をTreeSetに収集する例を見てみましょう。

import java.util.Collection;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Demo {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("25", "10", "15", "20", "25");
        Collection<String> collection = stream.collect(Collectors.toCollection(TreeSet::new));
        System.out.println("Collection = " + collection);
    }
}

実行結果

Collection = [10, 15, 20, 25]

TreeSetは要素を自動的にソートし、重複を除去して格納します。そのため、元のデータに2つ含まれていた"25"は1つにまとめられ、昇順で出力されます。

サンプルコード②:counting()メソッドで要素数をカウント

次に、Javaストリームのcounting()メソッドを使って、ストリーム内の要素数を数えてみましょう。

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Demo {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("Kevin", "Jofra", "Tom", "Chris", "Liam");
        // 要素数をカウント
        long count = stream.collect(Collectors.counting());
        System.out.println("Number of elements in the stream = " + count);
    }
}

実行結果

Number of elements in the stream = 5

このように、Collectors.counting()collect()と組み合わせることで、ストリーム内の要素数を簡単に取得できます。

まとめ

Stream APIを使うことで、データの絞り込み、変換、集計といった処理を直感的かつ簡潔に記述できます。中間操作と終端操作の違いを理解し、パイプライン処理を活用することで、より読みやすく保守性の高いJavaコードを実現しましょう。

  1. JavaのCollectors.toCollection()メソッドの使い方を徹底解説

    JavaのCollectors.toCollection()メソッドは、ストリームの入力要素を出現順(エンカウンター順)に新しいCollectionへ蓄積するCollectorを返します。toList()やtoSet()と異なり、ArrayListやTreeSetなど、任意のコレクション型を自由に指定できるのが大きな特徴です。toCollection()メソッドの構文static <T,C extends Collection<T>>Collector<T,?,C> toCollection(Supplier<C> collectionFacto

  2. Java 8 Streamsチュートリアル – コード例で学ぶStream APIの基本と使い方

    この記事では、Java 8のStreams(ストリーム)機能について詳しく解説し、さまざまなコード例を交えながらその使い方を紹介します。 Java StreamsはJavaに関数型プログラミングをもたらす強力な機能です。Java 8から導入されたため、それ以前のバージョンを使用している場合は、Java 8以降へのアップグレードが必要です。 なぜJava Streamsを使うべきなのか? Streamsには以下のようなメリットがあります。 少ないコード量で多くを実現できる — ごくわずかな行数のコードで、従来は多くの記述が必要だった処理を簡潔に実装できます。 ラムダ式を活用できる — 使い捨て