コース一覧
    Java中級:Streamと関数型
    Function インターフェース

    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分

    Function インターフェース

    変換のしかたが違うだけで、同じメソッドを 2 本書いている

    社員名の一覧を受け取って、片方は全部大文字にして返す。もう片方は文字数に変換して返す。やりたい変換は違いますが、1 件ずつ取り出して結果を詰め直す部分はまったく同じです。このままだと、変換のパターンが 1 つ増えるたびにメソッドが 1 本ずつ増えていきます。

    違うのは「1 つ受け取って、1 つ返す」中身だけです。その中身だけを外から渡せれば、詰め直す処理は 1 本で済みます。そのときに使う受け皿が java.util.function.Function<T, R> です。

    変換の中身だけを変数に入れる

    Function<T, R> は「T を 1 つ受け取って R を 1 つ返す」という意味の型です。<> の中は左が入力、右が出力の順に書きます。実際に動かす命令は apply の 1 つだけです。

    Java

    import java.util.function.Function;
    
    public class Demo {
        public static void main(String[] args) {
            Function<String, String> upper = s -> s.toUpperCase();
            Function<String, Integer> lengthOf = s -> s.length();
    
            System.out.println(upper.apply("java"));      // JAVA
            System.out.println(lengthOf.apply("java"));   // 4
        }
    }

    upper と lengthOf は中身がまったく違うのに、どちらも Function という同じ形の変数に入っています。だから「Function<String, String> を引数に取るメソッド」を 1 本用意しておけば、どの変換を使うかは呼ぶ側が選べます。関数を値として持ち回す、というのはこういうことです。

    2 段の変換を、1 つにまとめる

    「前後の空白を落としてから大文字にする」のように、変換が 2 段になることがあります。毎回 2 回 apply を呼んでもよいのですが、andThen を使うと 2 つの Function から新しい Function を 1 つ作れます。

    Java

    Function<String, String> trim = s -> s.trim();
    Function<String, String> upper = s -> s.toUpperCase();
    
    Function<String, String> clean = trim.andThen(upper);
    System.out.println(clean.apply("  java  "));  // JAVA

    a.andThen(b) は「先に a、その結果を b へ」という意味で、書いた順にそのまま流れます。元の trim と upper は書き換わらず、合成された新しい Function が返ってくるだけです。

    整数を入れると Integer が返ってくる

    Function<int, int> とは書けません。ジェネリクスはプリミティブ型を受け取れないので、整数を扱うときはラッパー型の Integer を書きます。

    Java

    Function<Integer, String> label = n -> n + " 件";
    System.out.println(label.apply(12));   // 12 件

    そのため apply が返すのは int ではなく Integer です。戻り値の型が int のメソッドでそのまま return しても、アンボクシングが自動で Integer から int に直してくれるので、キャストを書く必要はありません。

    解説

    速度が問題になる場面向けに、ボクシングを避ける IntFunction や IntUnaryOperator といった整数専用の型も用意されています。名前だけ頭の隅に置いて、必要になったときに調べれば十分です。

    課題では、整数を受け取って整数を返す Function を変数として 1 つ作り、apply に通した結果を返します。計算式を直接 return しても答えの数字は合いますが、それでは Function を経由したことになりません。必ず変数に入れてから apply を呼んでください。

    要件

    1. ファイル先頭で import java.util.function.Function; を書くこと
    2. メソッド内で Function<Integer, Integer> doubler = x -> x * 2; のようにラムダ式で Function を作ること
    3. doubler.apply(n) を呼び出し、その戻り値を int として return すること

    ヒント

    `Function<入力, 出力>` の順なので、`Function<Integer, Integer>` は「整数を受け取って整数を返す」関数を表します

    `apply(n)` の戻り値は `Integer` ですが、`int` 変数や `return` 文に渡せばオートアンボクシングで自動的に `int` に変換されるのでキャスト不要です

    ラムダ式 `x -> x * 2` は引数 1 つで `x * 2` を返す関数。`{}` や `return` を書かなくても `x * 2` の値がそのまま戻り値になります

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

    関連レッスン

    • Predicate インターフェース

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

    • Consumer と Supplier

      java.util.function パッケージの代表的な関数型インターフェース Consumer と Supplier の役割と使い分けを学び、List.forEach や Stream.peek での活用までを身につけよう。

    • BiFunction と 2 引数の関数

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

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

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

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

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

    • メソッドクラスに属する関数
    • 処理計算や代入を表す長方形
    • 変数データに名前をつけて参照する仕組み
    • 引数位置引数=順番で渡す。
    • 関数処理に名前を付けて再利用できる単位
    • ジェネリクス<String> のように型を指定する仕組み
    • プリミティブnumber / string / boolean などの基本型
    • プリミティブ型Javaの基本型(int/double/boolean等)
    main.java
    エディタを読み込んでいます

    メモ

    Function インターフェース

    ⌘S で保存