1. 5 を 2 倍すると 10
  2. 0 を 2 倍しても 0
  3. -3 を 2 倍すると -6 (負の数も扱える)
  4. 正の大きめの値 100 を 2 倍すると 200
コース一覧
Java 中級:コレクション・Stream・例外処理
Function インターフェース

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分

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 すること

入出力例

applyDouble(5) → 10 applyDouble(0) → 0 applyDouble(-3) → -6 applyDouble(100) → 200

ヒント

`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 で保存