コース一覧
    Java中級:Streamと関数型
    limit と skip

    Java中級:Streamと関数型

    Stream APIと関数型インターフェースを学び、データ処理を宣言的で再利用しやすい形に書けるようにします。

    1
    Stream API
    01. Stream を作る5分
    02. filter で絞り込む5分
    03. map で変換する5分
    04. reduce で集約する5分
    05. collect で集める5分
    06. sorted で並び替え5分
    07. distinct で重複排除5分
    08. limit と skip5分
    09. 並列ストリーム5分
    10. Stream API まとめクイズ5分
    2
    関数型インターフェース
    01. ラムダ式の基本5分
    02. メソッド参照 ::5分
    03. Function インターフェース5分
    04. Predicate インターフェース5分
    05. Consumer と Supplier5分
    06. BiFunction と 2 引数の関数5分
    07. 関数型インターフェース まとめクイズ5分

    limit と skip

    上位 5 件が見たいだけなのに、全部出てくる

    売上ランキングの上位 5 件だけ表示したい、というのはよくある要求です。for で書くと、カウンタを 1 つ増やして、途中で break することになります。

    Java

    int i = 0;
    for (String row : ranking) {
        System.out.println(row);
        i++;
        if (i == 5) break;
    }

    表示したいのは 5 行なのに、行数を数える変数と、抜ける条件が別々に必要です。limit(5) を使えば、この 2 つが 1 つになります。

    Java

    List<String> top5 = ranking.stream().limit(5).toList();

    limit(n) は先頭から n 件通したところで、流すのをやめます。残りは読みにも行きません。件数が足りないときも例外は出ません。3 件しか無いところに limit(10) を書けば、あるだけの 3 件が返ります。

    skip は逆に、先頭を捨てる

    skip(n) は反対で、先頭の n 件を捨てて、それ以降を通します。CSV の 1 行目にヘッダが入っているときに便利です。

    Java

    List<String> body = lines.stream().skip(1).toList();

    こちらも、n が要素数より大きいときに例外は出ません。全部飛ばされて、空のまま次に進みます。

    順番を入れ替えると、別の結果になる

    limit と skip はどちらも中間操作なので、つなげて書けます。ただし書く順番で結果が変わります。

    skip(1).limit(2) は、まず先頭 1 件を捨ててから、残った中の先頭 2 件を通します。手元に 5 件あるなら、2 件目と 3 件目が残ります。

    limit(2).skip(1) は、まず先頭 2 件だけに絞ってから、その中の先頭 1 件を捨てます。残るのは 2 件目だけです。

    同じ 2 つのメソッドを同じ引数で呼んでいるのに、結果は 2 件と 1 件で違います。「捨ててから取る」なのか「取ってから捨てる」なのかを、書く前に日本語で言えるようにしておくと間違えません。

    解説

    件数が足りないときに例外を投げてくれないのは、便利な反面わなでもあります。skip(10) を書いたのに空が返ってくるときは、元データが 10 件に届いていないことを疑ってください。

    やってみよう

    Solution.windowSum(int[] arr) を完成させて、配列の 3 件目から 5 件目までの合計を返してください。

    ファイルの先頭に import java.util.stream.IntStream; を書き、IntStream.of(arr) で Stream を作ります。先頭 2 件を捨てる skip と、そこから 3 件だけ通す limit を、この順番でつないでください。最後に sum() で合計を取ります。自前の for で足し込むのは禁止です。

    要素が 2 件しか無い配列を渡されたときは、捨てた時点で何も残らないので、合計は 0 になります。ここでも長さを調べる if は要りません。

    要件

    1. ファイル先頭で import java.util.stream.IntStream; を書くこと
    2. IntStream.of(arr) で int[] から IntStream を作り、.skip(2) .limit(3) の順で中間操作を呼ぶこと
    3. 終端操作 .sum() を呼んで合計を int で return すること (自前の for ループで合計しないこと)

    ヒント

    `skip` と `limit` の順序が逆になると結果が変わります。今回は必ず `.skip(2).limit(3)` の順で書いてください

    要素が 2 件以下のときは `skip(2)` で空の `IntStream` になり、`sum()` は何も足さずに `0` を返してくれます。`if` での特別扱いは不要です

    `IntStream` の `sum()` は戻り値が `int` です。`Stream<Integer>` の場合は `mapToInt` で `IntStream` に変換してから `sum()` を呼びます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • 並列ストリーム

      Stream API の parallel() で配列を複数 CPU コアに分割集計させる並列ストリームの仕組みと、結合性・スレッド安全・順序保証など並列化の落とし穴を学びます。

    • Stream API まとめクイズ

      Stream API 章で学んだ生成 / filter / map / reduce / collect / sorted / distinct / limit / skip / parallel を、メソッドチェーンの順序と中間操作・ターミナル操作の使い分けで総ざらいする 4 択クイズ。

    • ラムダ式の基本

      Java 8 から導入されたラムダ式の文法と関数型インターフェースの考え方を学び、Stream と組み合わせて配列の合計を一行で書く感覚を身につけよう。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • カウンタ数を保持して増減する典型 UI
    • 変数データに名前をつけて参照する仕組み
    • 素数1 と自分自身でしか割り切れない自然数
    • メソッドクラスに属する関数
    • 引数位置引数=順番で渡す。
    • 配列サイズ固定の同型データの集まり
    • ループ繰り返し処理。矢印で戻すか専用記号で示す
    main.java
    エディタを読み込んでいます

    メモ

    limit と skip

    ⌘S で保存