0Pricing
Java Academy · レッスン

Function と BiFunction

関数型に値を変換します。

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

Function が表すもの

Function<T, R> は java.util.function の中核となる変換インターフェースです。型 T の引数を1つ受け取り、型 R の結果を返します。

  • 唯一の抽象メソッドは R apply(T t) です。
  • 入力から出力への純粋な写像を表します。
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, Integer> length = s -> s.length();
        System.out.println(length.apply("hello"));
    }
}

apply を呼び出す

Function は apply を呼び出して実行します。ラムダ本体が変換ロジックになります。

  • 入力型と出力型は異なっていてもかまいません。
  • String::toUpperCase のようなメソッド参照でラムダを置き換えられます。
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> upper = String::toUpperCase;
        System.out.println(upper.apply("java"));
    }
}

andThen による合成

andThen は関数を連結します。最初の関数の結果が、次の関数の入力になります。

  • f.andThen(g) は g(f(x)) を意味します。
  • 左から右に読めます。
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> times2 = n -> n * 2;
        Function<Integer, Integer> plus3 = n -> n + 3;
        System.out.println(times2.andThen(plus3).apply(5));
    }
}

compose による合成

compose は引数の関数を先に実行します。

  • f.compose(g) は f(g(x)) を意味します。
  • andThen と反対の順序で処理します。
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> times2 = n -> n * 2;
        Function<Integer, Integer> plus3 = n -> n + 3;
        System.out.println(times2.compose(plus3).apply(5));
    }
}

Function.identity

Function.identity() は、入力を変更せずそのまま返す関数を返します。

  • ストリームのコレクターやデフォルトのマッピングで便利です。
  • x -> x と同等です。
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> id = Function.identity();
        System.out.println(id.apply("unchanged"));
    }
}

BiFunction を使う

BiFunction<T, U, R> は2つの引数を受け取り、1つの結果を返します。

  • メソッドは R apply(T t, U u) です。
  • マップのマージなど、2つの値の組み合わせに適しています。
import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        System.out.println(add.apply(4, 6));
    }
}

異なる型の BiFunction

BiFunction の3つの型パラメーターは、すべて異なっていてもかまいません。

  • ここでは String と int を組み合わせて String に変換します。
import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        BiFunction<String, Integer, String> repeat = (s, n) -> s.repeat(n);
        System.out.println(repeat.apply("ab", 3));
    }
}

BiFunction の andThen

BiFunction は andThen もサポートしており、結果を後処理するための単一引数の Function を受け取ります。

  • BiFunction に compose がないのは、2つの入力が必要になるためです。
import java.util.function.BiFunction;
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        Function<Integer, String> label = n -> "sum=" + n;
        System.out.println(add.andThen(label).apply(7, 8));
    }
}

コレクションで関数を使う

多くの API は Function を受け取ります。たとえば Map.computeIfAbsent は、存在しないキーに対応するマッピング関数を受け取ります。

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> lengths = new HashMap<>();
        lengths.computeIfAbsent("hello", String::length);
        System.out.println(lengths);
    }
}

関数を変数に格納する

関数はオブジェクトなので、格納したり、渡したり、返したりできます。これが関数型スタイルの Java の基盤です。

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> square = n -> n * n;
        Function<Integer, Integer> cube = n -> n * n * n;
        Function<Integer, Integer> chosen = square;
        System.out.println(chosen.apply(5));
    }
}

パイプラインを構築する

andThen を繰り返し連結すると、読みやすく再利用可能な変換パイプラインを構築できます。

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> trim = String::trim;
        Function<String, String> upper = String::toUpperCase;
        Function<String, Integer> len = String::length;
        System.out.println(trim.andThen(upper).andThen(len).apply("  abc "));
    }
}

理解度チェック

f.andThen(g).apply(x) は何を計算するでしょうか。

まとめ

中核となる変換インターフェースについて学びました。

  • Function<T,R> は apply を使って1つの値を変換します。
  • andThen は順方向に連結し(g(f(x)))、compose は逆方向に連結します(f(g(x)))。
  • Function.identity() は入力をそのまま返します。
  • BiFunction<T,U,R> は2つの入力を処理し、andThen をサポートしますが、compose はサポートしません。

よくある質問

「Function と BiFunction」レッスンは無料ですか?

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

「Function と BiFunction」で何を学びますか?

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

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

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

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

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

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

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

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

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