1. Supplier<String> の get() の結果は "hi" になる
コース一覧
Java 中級:コレクション・Stream・例外処理
Consumer と Supplier

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
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分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ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)

入出力例

forwardSupplier() → "hi"

ヒント

`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 択クイズで確認する。

  • String.format で書式化

    `Java` の `String.format` で `%s` `%d` `%,d` `%.2f` などの書式指定子を使い、整形された文字列を組み立てる方法を学ぼう。

  • LocalDate で日付を扱う

    Java 8 で導入された java.time.LocalDate を使って、日付の生成・加減算・整形を学び、年月日から ISO 形式の文字列を返すコードを書いてみよう。

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

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

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

メモ

Consumer と Supplier

⌘S で保存