コース一覧
    Java中級:Streamと関数型
    Consumer と Supplier

    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分

    Consumer と Supplier

    表示のしかたが違うだけで、また同じループを書いている

    一覧を 1 件ずつ処理する場面で、ある画面では標準出力に出し、別の場所ではログに書き、また別の場所では別のリストに足す。やっていることが違うのは 1 行だけで、回して 1 件ずつ渡す部分は毎回同じです。

    ここで渡したいのは「受け取って、何かして、終わり」という処理です。返す値はありません。この形を表す型が java.util.function.Consumer<T> です。

    Java

    import java.util.List;
    import java.util.function.Consumer;
    
    public class Demo {
        public static void main(String[] args) {
            Consumer<String> show = s -> System.out.println("- " + s);
    
            show.accept("java");                        // - java
            List.of("list", "map", "set").forEach(show);
        }
    }

    動かす命令は accept の 1 つで、戻り値は void です。List.forEach の引数がちょうどこの型なので、作った Consumer をそのまま渡せます。ラムダの中で return に値を書くとコンパイルエラーになります。値を返したくなったら、それは Function の役目です。

    使うかどうか分からない値を、先に作ってしまう

    逆に「引数は取らないが、値を 1 つ返す」型が Supplier<T> です。命令の名前は get です。

    Supplier がありがたいのは、値そのものではなく 値の作り方 を渡せるところです。既定値を用意する処理を値として渡すと、実際には使われない場合でも毎回作られてしまいます。作り方だけ渡しておけば、必要になった瞬間に 1 回だけ作れます。

    Java

    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Supplier;
    
    public class Demo2 {
        public static void main(String[] args) {
            Supplier<List<String>> newBox = () -> new ArrayList<>();
    
            List<String> a = newBox.get();
            List<String> b = newBox.get();
            a.add("java");
    
            System.out.println(a);   // [java]
            System.out.println(b);   // []
        }
    }

    get を呼ぶたびに新しい ArrayList ができるので、a に足しても b には影響しません。Supplier は値ではなく工場だ、と考えると腑に落ちます。

    変数を作っただけでは、何も起きない

    一番多い詰まり方は、呼び出しを書き忘れることです。

    Java

    List<String> ng = newBox;         // コンパイルエラー
    List<String> ok = newBox.get();   // これで値になる

    newBox は「作り方」であって「作られた値」ではないので、型が合いません。Consumer も同じで、show を用意しただけでは何も表示されず、show.accept("java") と呼んで初めて走ります。

    解説

    名前で覚えるなら、Consume は受け取って終わり、Supply は持ってくる、です。矢印の向きだけ思い出せば取り違えません。

    課題では Supplier<String> を変数として作り、get の戻り値を返します。文字列をそのまま return しても結果は同じですが、それでは Supplier を通したことにならないので注意してください。

    要件

    1. ファイル先頭で import java.util.function.Supplier; を書くこと
    2. メソッド内で Supplier<String> をラムダ式 () -> "hi" で生成すること
    3. 生成した Supplier の get() を呼び出して、その戻り値を return すること (固定文字列を直接返すのは NG)

    ヒント

    `Supplier<T>` の抽象メソッドは引数なしの `get()` です。ラムダ式は左側のかっこが空っぽの `() -> "hi"` の形になります

    `Supplier<String> hello = () -> "hi";` のように一度変数に入れると、`hello.get()` で `"hi"` が取り出せます

    `return hello.get();` のように、必ず `()` 付きで `get()` を呼び出してください。`return hello;` だと型が合わずコンパイルエラーになります

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

    関連レッスン

    • BiFunction と 2 引数の関数

      2 つの引数を受け取って 1 つの値を返す BiFunction、同じ型同士を扱う BinaryOperator、そして BiPredicate / BiConsumer といった「2 引数版」の関数型インターフェースを整理し、引数が複数あるラムダの書き方を身につけよう。

    • 関数型インターフェース まとめクイズ

      関数型インターフェース (Lambda / メソッド参照 / Function / Predicate / Consumer / Supplier / BiFunction) の総まとめ。代表的な 7 つの関数型インターフェースの違いを 4 択クイズで確認する。

    • Predicate インターフェース

      Java の関数型インターフェースの代表格 `Predicate<T>` を取り上げ、`test` メソッドで条件を判定し、`and` `or` `negate` で条件を合成する書き方を身につけよう。

    • Function インターフェース

      Java の代表的な関数型インタフェース `Function<T, R>` を取り上げ、ラムダ式で値を変換する関数を作って `apply` で呼び出すコードを書いてみよう。

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

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

    • ループ繰り返し処理。矢印で戻すか専用記号で示す
    • 処理計算や代入を表す長方形
    • リスト順序付きで複数の値を扱うデータ構造
    • 戻り値呼び出し元への返答を表す点線矢印
    • 引数位置引数=順番で渡す。
    • コンパイルソースをバイトコードへ変換する処理
    • 変数データに名前をつけて参照する仕組み
    • メソッドクラスに属する関数
    main.java
    エディタを読み込んでいます

    メモ

    Consumer と Supplier

    ⌘S で保存