0Pricing
Java Academy · レッスン

Supplier と Consumer

値を生成・消費します。

「Supplier と Consumer」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Supplier の役割

Supplier<T> は引数を受け取らず、型 T の値を生成します。

  • メソッドは T get() です。
  • 遅延または延期された値の生成に適しています。
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<String> greeting = () -> "Hello!";
        System.out.println(greeting.get());
    }
}

Supplier は遅延実行される

Supplier 内のコードは get が呼び出されたときにだけ実行されます。そのため、実際には不要になる可能性がある高コストなデフォルト値の生成に適しています。

import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<Integer> expensive = () -> {
            System.out.println("computing...");
            return 42;
        };
        System.out.println("before get");
        System.out.println(expensive.get());
    }
}

デフォルト値の Supplier

多くの API は Supplier を受け取り、必要になったときだけ値を計算できるようにします。Optional.orElseGet などがその例です。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> name = Optional.empty();
        System.out.println(name.orElseGet(() -> "default"));
    }
}

Consumer の役割

Consumer<T> は値を受け取り、何も返しません(void)。

  • メソッドは void accept(T t) です。
  • 出力やログ記録などの副作用に使います。
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Consumer<String> printer = s -> System.out.println("Got: " + s);
        printer.accept("data");
    }
}

forEach と Consumer

Consumer を最もよく使う場所は、Iterable.forEach と Stream.forEach です。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> items = List.of("a", "b", "c");
        items.forEach(item -> System.out.println(item));
    }
}

andThen で Consumer を連結する

Consumer は andThen をサポートしており、同じ入力に対して2つの Consumer を順番に実行できます。

import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Consumer<String> first = s -> System.out.println("upper: " + s.toUpperCase());
        Consumer<String> second = s -> System.out.println("len: " + s.length());
        first.andThen(second).accept("hello");
    }
}

2つの入力に対応する BiConsumer

BiConsumer<T, U> は2つの引数を受け取り、何も返しません。Map.forEach はこれを使ってキーと値のペアを反復処理します。

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> ages = Map.of("Ann", 30, "Bob", 25);
        ages.forEach((name, age) -> System.out.println(name + "=" + age));
    }
}

Consumer としてのメソッド参照

System.out::println のようなメソッド参照は、簡潔な Consumer になります。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3);
        nums.forEach(System.out::println);
    }
}

Supplier と Consumer の組み合わせ

Supplier が生成した値を、そのまま Consumer に渡すことで、生成してから消費するシンプルな処理の流れを作れます。

import java.util.function.Supplier;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Supplier<String> source = () -> "payload";
        Consumer<String> sink = s -> System.out.println("received " + s);
        sink.accept(source.get());
    }
}

オブジェクトを返すSupplier

引数が不要な場合、コンストラクターは ClassName::new によって自然なSupplierになります。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<List<String>> factory = ArrayList::new;
        List<String> list = factory.get();
        list.add("x");
        System.out.println(list);
    }
}

副作用と純粋関数の違い

次の違いを覚えておいてください。

  • Supplier:入力を受け取らず、出力を生成します。
  • Consumer:入力を受け取り、出力を生成しません(副作用)。
  • Function:入力を受け取り、出力を返します。
import java.util.function.Supplier;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Supplier<Integer> dice = () -> 4;
        Consumer<Integer> show = n -> System.out.println("rolled " + n);
        show.accept(dice.get());
    }
}

理解度チェック

引数を取らず、値を返す関数型インターフェースはどれですか。

まとめ

値の生成と消費を関数型に行いました。

  • Supplier<T>はget()を使って遅延生成を行います。
  • Consumer<T>はaccept()を使って副作用を実行し、andThenで連結します。
  • BiConsumer<T,U>は、Map.forEachのように2つの入力を処理します。
  • メソッド参照とコンストラクター参照を使うと、どちらも簡潔に記述できます。

よくある質問

「Supplier と Consumer」レッスンは無料ですか?

はい。「Supplier と Consumer」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「Supplier と Consumer」で何を学びますか?

値を生成・消費します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Supplier と Consumer」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Function と BiFunction
  2. Supplier と Consumer
  3. Predicate と合成
  4. カスタム関数型インターフェース
← Java Academyに戻る