Java 8のStream APIとコレクションの違いを徹底解説
Javaのコレクションフレームワーク(Collections Framework)は、データのグループを格納および操作するために使用される仕組みです。コレクションはインメモリ上のデータ構造であり、要素をコレクションに追加する前に、そのすべての要素が事前に計算(メモリ上に展開)されている必要があります。
一方、Stream APIはデータのグループを処理することだけを目的としたAPIです。ストリームは元となるコレクション自体を一切変更せず、パイプラインとして連結されたメソッド(中間操作・終端操作)に従って処理結果を返すだけです。
コレクションとストリームの主な違い
| No. | 項目 | コレクション | ストリーム |
|---|---|---|---|
| 1 | 基本 | データのグループを格納・操作するために使用する | データのグループを処理するためだけに使用する |
| 2 | パッケージ | すべてのクラスとインターフェースは java.util パッケージに含まれる | すべてのクラスとインターフェースは java.util.stream パッケージに含まれる |
| 3 | 即時評価/遅延評価 | すべての要素は最初の時点で計算(メモリに展開)される | 中間操作は遅延評価(Lazy)され、終端操作が呼ばれた時点で実行される |
| 4 | データの変更 | 要素の追加や削除が可能 | ストリーム自体は変更できない |
| 5 | 外部/内部イテレータ | 開発者が明示的にループを記述して反復処理を行う(外部イテレーション) | ストリーム側が内部で反復処理を行う(内部イテレーション) |
コレクションの使用例
以下は、コレクションを使ってリストを作成し、ソートしてから拡張for文で表示する例です。要素の追加やソートなど、データ構造そのものを直接操作している点に注目してください。
public class CollectionsExample {
public static void main(String[] args) {
List<String> laptopList = new ArrayList<>();
laptopList.add("HCL");
laptopList.add("Apple");
laptopList.add("Dell");
Comparator<String> com = (String o1, String o2) -> o1.compareTo(o2);
Collections.sort(laptopList, com);
for (String name : laptopList) {
System.out.println(name);
}
}
}
ストリームの使用例
同じ処理をStream APIで書き直すと、以下のように非常に簡潔になります。sorted() や forEach() をパイプラインで連結するだけで、元のリストは変更されずに並べ替えられた結果が出力されます。
public class StreamsExample {
public static void main(String[] args) {
List<String> laptopList = new ArrayList<>();
laptopList.add("HCL");
laptopList.add("Apple");
laptopList.add("Dell");
laptopList.stream()
.sorted()
.forEach(System.out::println);
}
}
まとめ
コレクションは「データの保管庫」であり、要素の追加・削除などデータ構造の管理を担います。それに対してストリームは「データの加工ライン」であり、フィルタリング、マッピング、ソートなどの宣言的なデータ処理に特化しています。両者は対立するものではなく、コレクションに蓄えたデータをStream APIで効率よく処理するという形で組み合わせて使うのが、Java 8以降のモダンなプログラミングスタイルです。
-
Javaコレクションのnext()とhasNext()の違いを徹底解説!Iteratorの使い方まとめ
Javaでは、IteratorやListIteratorといったインターフェースを使うことで、コレクションオブジェクト(ListやSetなど)の要素を1つずつ順番に取り出すことができます。この記事では、Iteratorで頻繁に使われるhasNext()メソッドとnext()メソッドの違いについて、サンプルコードを交えながら詳しく解説します。 hasNext()メソッドとは hasNext()は、コレクション内にまだ次の要素が存在するかどうかを確認するためのメソッドです。次の要素があればtrueを、なければfalseを返します。戻り値はboolean型である点に注意してください。このメソッド自体
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って