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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Function と BiFunction
- Supplier と Consumer
- Predicate と合成
- カスタム関数型インターフェース