Skip to content
閲覧中:
1. Streamの生成(1-15)

1. Streamの生成(1-15)

Java Goldの試験範囲(SE 11/17/21)に基づき、**「Streamの生成」1番から15番**のサンプルコードと試験で問われるポイントを解説します。


1-5: 基本的な生成

Java
// 1. Stream.of: 可変引数から生成
Stream<String> s1 = Stream.of("A", "B", "C");

// 2. Collection.stream: ListやSetから生成
List<String> list = List.of("apple", "banana");
Stream<String> s2 = list.stream();

// 3. Arrays.stream: 配列から生成
String[] array = {"X", "Y", "Z"};
Stream<String> s3 = Arrays.stream(array);

// 4. Stream.empty: 空のStream(条件分岐の戻り値などで利用)
Stream<Object> s4 = Stream.empty();

// 5. Stream.iterate (無限): シード値と演算
// 0から始まり、2ずつ加算される無限ストリーム
Stream<Integer> s5 = Stream.iterate(0, n -> n + 2); 

6-10: Java 9以降・プリミティブ型

Java
// 6. Stream.iterate (有限): Java 9+ で追加(forループに近い)
// 第2引数にPredicate(継続条件)を指定できる
Stream<Integer> s6 = Stream.iterate(0, n -> n < 10, n -> n + 2);

// 7. Stream.generate (無限): Supplierから生成
Stream<Double> s7 = Stream.generate(Math::random);

// 8. IntStream.range: 終端を含まない (1, 2, 3, 4)
IntStream s8 = IntStream.range(1, 5);

// 9. IntStream.rangeClosed: 終端を含む (1, 2, 3, 4, 5)
IntStream s9 = IntStream.rangeClosed(1, 5);

// 10. String.chars: 文字列を文字コード(int)のStreamに変換
// ※戻り値は Stream<Character> ではなく IntStream であることに注意
IntStream s10 = "Java".chars(); 

11-15: 特殊なソースと並列化

Java
// 11. Files.lines: ファイルの各行をStreamとして読み込む
// Try-with-resources推奨(IOリソースの解放が必要なため)
try (Stream<String> s11 = Files.lines(Paths.get("test.txt"))) {
    s11.forEach(System.out::println);
}

// 12. Random.ints: 指定した範囲のランダムな数値Stream
IntStream s12 = new Random().ints(5, 1, 100); // 1〜99を5個

// 13. Stream.builder: 動的に要素を追加してビルド
Stream<String> s13 = Stream.<String>builder()
    .add("Java").add("Gold").build();

// 14. Stream.concat: 2つのStreamを結合
Stream<String> left = Stream.of("A", "B");
Stream<String> right = Stream.of("C", "D");
Stream<String> s14 = Stream.concat(left, right);

// 15. Collection.parallelStream: 並列処理用Stream
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Stream<Integer> s15 = numbers.parallelStream();

💡 Java Gold 試験対策の「落とし穴」

  • プリミティブ vs オブジェクト: Arrays.stream(int[])IntStream を返しますが、Stream.of(int[]) は「int配列そのもの」を1つの要素として持つ Stream<int[]> を返します。ここが最もひっかけで出やすいポイントです。
  • 無限Streamの停止: iterategenerate を使う場合、必ず limit() などの中間操作を挟まないと、終端操作を呼んだ瞬間に無限ループ(またはメモリ不足)に陥ります。
  • IntStreamの特殊メソッド: s10 のように chars() で取得した IntStream を文字に戻すには、.mapToObj(c -> (char)c) が必要です。

次は、中間操作(16〜30番)の具体的な挙動やコード例を確認しますか?