😺
JavaSilver強化④関数型インターフェースとラムダ式
関数型インターフェースとは?
関数型インターフェースとは、1つの抽象メソッドだけを持つインターフェースのことです。
Java 8から導入され、ラムダ式で簡単に実装することができます。
関数型インターフェースの特徴:
- 抽象メソッドが1つだけである。
-
@FunctionalInterface
アノテーションがあると、コンパイラが関数型インターフェースであることをチェックします。
Runnable
インターフェース
例:@FunctionalInterface
public interface Runnable {
void run();
}
ラムダ式とは?
ラムダ式は、匿名クラスの簡略化された記述方法です。
ラムダ式を使用すると、関数型インターフェースを簡潔に実装することができます。
基本的な構文:
(引数) -> { 処理 }
Runnable
をラムダ式で表現
例:Runnable task = () -> System.out.println("実行中!");
task.run(); // 実行中!
代表的な関数型インターフェースとラムダ式
関数型インターフェースは1つの抽象メソッドを持つ。
そして、その抽象メソッドの定義をラムダ式で行われる感じです。
Javaには標準的な関数型インターフェースがいくつか用意されています。
以下はその代表例です。
Consumer<T>
— 引数を受け取って処理を行う
1. -
メソッド:
void accept(T t)
- 使用例: 値を受け取って処理する(例: 出力)
Consumer<String> printer = s -> System.out.println("出力: " + s);
printer.accept("こんにちは"); // 出力: こんにちは
Supplier<T>
— 値を返す
2. -
メソッド:
T get()
- 使用例: 値を生成して返す(例: データ提供)
Supplier<String> supplier = () -> "Java Silver 勉強中";
System.out.println(supplier.get()); // Java Silver 勉強中
Function<T, R>
— 引数を受け取り、結果を返す
3. -
メソッド:
R apply(T t)
- 使用例: 値を変換する(例: 文字列の長さ)
Function<String, Integer> lengthFunc = s -> s.length();
System.out.println(lengthFunc.apply("Hello")); // 5
Predicate<T>
— 条件判定を行う
4. -
メソッド:
boolean test(T t)
- 使用例: 条件判定(例: 数字が偶数かどうか)
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
Runnable
— 実行する(引数なし)
5. -
メソッド:
void run()
- 使用例: 処理の実行
Runnable task = () -> System.out.println("処理実行中...");
task.run(); // 処理実行中...
関数型インターフェースを作る方法
自分で関数型インターフェースを作成することもできます。
以下は、文字列の長さを取得する関数型インターフェースの例です。
自作関数型インターフェースの例:
@FunctionalInterface
public interface StringLengthFunction {
int getLength(String s);
}
使用例:
public class Main {
public static void main(String[] args) {
StringLengthFunction lengthFunc = s -> s.length();
System.out.println(lengthFunc.getLength("Java")); // 4
}
}
まとめ
Javaの関数型インターフェースとラムダ式は、コードを簡潔にする強力なツールです。
特に、標準的な関数型インターフェースはよく使われるので、試験や実務でよく出題されます。
ラムダ式とともに使うことで、コードの可読性と保守性が向上します。
- 関数型インターフェース: 抽象メソッドが1つのインターフェース
- ラムダ式: 関数型インターフェースを簡潔に実装するための記法
-
代表的なインターフェース:
Runnable
,Consumer
,Supplier
,Function
,Predicate
インターフェース | メソッド名 | 引数の型 | 戻り値の型 | 主な用途 | 例 |
---|---|---|---|---|---|
Runnable | void run() | なし | なし | 引数も戻り値もない処理を実行 | () -> System.out.println("実行") |
Consumer<T> | void accept(T t) | T | なし | 値を受け取って処理 | s -> System.out.println(s) |
Supplier<T> | T get() | なし | T | 値を生成して提供 | () -> "Hello" |
Function<T, R> | R apply(T t) | T | R | 値を変換(T→R) | s -> s.length() |
Predicate<T> | boolean test(T t) | T | boolean | 条件に一致するかどうかを判定 | s -> s.isEmpty() |
Discussion