Skip to content
閲覧中:
100本ノック

100本ノック

Java Gold(SE 11/17/21)の試験対策において、Stream APIは最も配点が高く、かつ「ひっかけ問題」が作りやすい最重要分野です。

100本すべてをコードで書くと膨大になるため、**試験に出る「急所」を100個のチェックリスト(逆引きリファレンス)**にまとめました。これらをすべて理解していれば、Stream問題は満点が狙えます。


1. Streamの生成(1-15)

  1. Stream.of(1, 2, 3):可変引数から生成
  2. list.stream():Collectionから生成
  3. Arrays.stream(array):配列から生成
  4. Stream.empty():空のStream
  5. Stream.iterate(0, n -> n + 2):無限Stream(シード値と関数)
  6. Stream.iterate(0, n -> n < 10, n -> n + 2):Java 9以降の有限iterate
  7. Stream.generate(Math::random):無限Stream(Supplierを使用)
  8. IntStream.range(1, 5):1, 2, 3, 4 (5を含まない)
  9. IntStream.rangeClosed(1, 5):1, 2, 3, 4, 5 (5を含む)
  10. String.chars():文字列をIntStreamに変換
  11. Files.lines(path):ファイル各行のStream
  12. Random.ints():乱数のIntStream
  13. Stream.builder().add(1).build():Builderパターン
  14. Stream.concat(s1, s2):2つのStreamの連結
  15. Collection.parallelStream():並列Streamの生成

    2. 中間操作:基本(16-30)

  16. filter(Predicate):条件一致のみ

  17. map(Function):型の変換、値の加工
  18. distinct():重複排除(equals()hashCode()を使用)
  19. sorted():自然順序でソート
  20. sorted(Comparator):カスタムソート
  21. peek(Consumer):デバッグ用。要素を変更せず処理を通す
  22. limit(long):先頭からn個に制限(短絡評価)
  23. skip(long):先頭からn個を捨てる
  24. flatMap(Function<T, Stream<R>>):1対多の展開・平坦化
  25. mapToInt / mapToLong / mapToDouble:プリミティブStreamへの変換
  26. boxed():プリミティブStreamからラッパー型Streamへ
  27. asDoubleStream():IntStreamなどをDoubleStreamへ
  28. mapToObj(IntFunction):プリミティブからオブジェクトへ
  29. takeWhile(Predicate):条件を満たさなくなった時点で終了 (Java 9+)
  30. dropWhile(Predicate):条件を満たす間は捨て、その後を維持 (Java 9+)

    3. 終端操作:基本(31-45)

  31. forEach(Consumer):順次処理

  32. forEachOrdered(Consumer):並列でも順序を維持して処理
  33. toArray():Object配列を返す
  34. toArray(IntFunction):特定の型(String[]::new等)の配列
  35. reduce(BinaryOperator):1つの値に集約(Optionalを返す)
  36. reduce(identity, BinaryOperator):初期値あり集約(値を返す)
  37. collect(Collector):List, Set, Mapなどへ変換
  38. min(Comparator) / max(Comparator):最小・最大
  39. count():要素数(long型)
  40. anyMatch(Predicate):どれか1つでも一致するか(短絡評価)
  41. allMatch(Predicate):すべて一致するか(短絡評価)
  42. noneMatch(Predicate):1つも一致しないか(短絡評価)
  43. findFirst():最初の要素(Optional)
  44. findAny():どれか1つの要素(Optional。並列で効果的)
  45. iterator():StreamからIteratorを得る

    4. Collectorsクラス(46-65)

  46. toList() / toUnmodifiableList() (Java 16+)

  47. toSet() / toUnmodifiableSet()
  48. toCollection(ArrayList::new):特定の具象クラスへ
  49. toMap(keyMapper, valueMapper)
  50. toMap(key, value, mergeFunction):キー重複時の処理を指定
  51. joining():文字列連結
  52. joining(","):デリミタ付き連結
  53. joining(",", "[", "]"):接頭辞・接尾辞付き
  54. summingInt(ToIntFunction):合計
  55. averagingInt(ToIntFunction):平均
  56. summarizingInt(ToIntFunction):統計情報(IntSummaryStatistics)
  57. counting():要素数
  58. minBy(Comparator) / maxBy(Comparator)
  59. groupingBy(Function):Map>にグループ化
  60. groupingBy(Function, Collector):下流(downstream)コレクタを指定
  61. partitioningBy(Predicate):true/falseの2つに分割
  62. mapping(Function, Collector):集計中に型変換
  63. filtering(Predicate, Collector):集計中にフィルタ (Java 9+)
  64. flatMapping(Function, Collector):集計中に平坦化 (Java 9+)
  65. collectingAndThen(Collector, Function):集計後に別の型に変換

    5. 並列Streamの挙動(66-75)

  66. parallel():中間操作で並列化

  67. sequential():順次処理に戻す
  68. isParallel():並列かどうか確認
  69. unordered():順序の制約を外す(並列化の高速化)
  70. reduceにおける第3引数:並列時の結合器(Combiner)
  71. identityの性質:op(identity, x) == x である必要性
  72. 並列時の findFirst vs findAny
  73. 並列時の副作用:forEach内での外部変数操作はNG
  74. Spliterator:Streamの分割用イテレータ
  75. ステートフル中間操作(sorted, distinct)の並列負荷

    6. Optionalの連携(76-85)

  76. Optional.ofNullable(val)

  77. ifPresent(Consumer)
  78. ifPresentOrElse(Consumer, Runnable) (Java 9+)
  79. orElse(T):デフォルト値
  80. orElseGet(Supplier):遅延評価のデフォルト値
  81. orElseThrow():例外を投げる
  82. filter(Predicate):Optional内の値をフィルタ
  83. map(Function):Optional内の値を変換
  84. flatMap(Function):Optionalを返す関数と連結
  85. stream():OptionalをStreamに変換 (Java 9+)

    7. 試験で狙われる特殊仕様・ひっかけ(86-100)

  86. Streamの再利用不可:一度終端操作を呼ぶとIllegalStateException

  87. 遅延評価:終端操作を呼ばないと中間操作は実行されない
  88. プリミティブStreamの専用メソッドsum(), average(), summaryStatistics()
  89. 関数型インターフェースの使い分けPredicate, Function, Consumer, Supplier
  90. Comparatorの合成reversed(), thenComparing()
  91. 空のStreamに対する終端操作countは0、allMatchはtrue、anyMatchはfalse
  92. nullを含むStreamsorted()などでNullPointerException
  93. 無限Streamの終端操作limitなしでsortedcollectを呼ぶと停止しない
  94. flatMapの戻り値:Streamである必要がある(Collectionではない)
  95. バイナリ演算reduce(0, (a, b) -> a + b)
  96. 副作用の禁止:Stream外の変数を書き換えない
  97. peekは要素を捨てない:あくまでデバッグ・監視用
  98. IntStreamの max()OptionalInt を返す
  99. toMapの第3引数がない場合:キー重複で例外が発生する
  100. Stream.of(array) vs Arrays.stream(array):プリミティブ配列時の挙動の違い

学習アドバイス

Java Gold試験では、「このコードを実行するとどうなるか?」という問題が出ます。 特に 「39. count()」のような終端操作がないために何も出力されない というひっかけや、「86. Streamの再利用」による例外 は頻出です。

この100項目の中で、コード例を見てみたい特定の番号はありますか?詳しく解説します。