Java ジェネリクスメソッド+関数渡し
2025 年 6 月 11 日 by marukorジェネリクスメソッドに関数を渡すとは?
ジェネリクスで型を柔軟にしたうえで、 その型に応じた関数(処理)を引数としてメソッドに渡す。
→ より汎用的なロジックを使いまわせるようになります。
関数型インターフェース(Function、Consumer、Predicateなど)とラムダ式
Function<T, R>
用途: T
型の入力を受け取り、R
型の結果を返す処理を表します。
使い所: 何かを変換・マッピングしたいときに使います。
Cunsumer<T>
用途: T型の入力を受け取り、何かを実行するが値は返さない処理を表します。
使い所: リストの各要素に対して処理を行うときなど。
Predicatee<T>
用途: T型の入力を受け取り、真偽値(boolean)を返す条件判定処理を表します。
使い所: フィルタ条件などに使います。
Function<T, R>:変換関数の例
public class GenericsWithFunction { // T型のListをR型のListに変換する汎用メソッド public static <T, R> List<R> map(List<T> list, Function<T, R> func) { List<R> result = new ArrayList<>(); for (T item : list) { result.add(func.apply(item)); } return result; } public static void main(String[] args) { List<String> names = List.of("Taro", "Hanako", "Jiro"); // StringをInteger(長さ)に変換 List<Integer> lengths = map(names, s -> s.length()); System.out.println(lengths); // [4, 6, 4] } }
解説
・Function は「T型を受け取って、R型を返す関数」
・map() メソッドは、リストの各要素にその関数を適用して変換
・例では “Taro” → 4 のように文字列の長さを返している
Predicate<T>:条件でフィルターする例
public class GenericsWithPredicate { // T型のリストから、条件に合うものだけを返す public static <T> List<T> filter(List<T> list, Predicate<T> condition) { List<T> result = new ArrayList<>(); for (T item : list) { if (condition.test(item)) { result.add(item); } } return result; } public static void main(String[] args) { List<Integer> numbers = List.of(1, 2, 3, 4, 5); // 偶数だけ抽出 List<Integer> evens = filter(numbers, n -> n % 2 == 0); System.out.println(evens); // [2, 4] } }
解説
・Predicate は「T型を受け取って、真偽値を返す関数」
・filter() メソッドは条件に合う要素だけをリストに追加
・例では n -> n % 2 == 0 という関数で偶数だけに絞っている
Consumer<T>:処理だけを行う例
public class GenericsWithConsumer { // 各要素に処理を適用するだけ(結果は返さない) public static <T> void forEach(List<T> list, Consumer<T> action) { for (T item : list) { action.accept(item); } } public static void main(String[] args) { List<String> messages = List.of("Hello", "World", "Java"); forEach(messages, msg -> System.out.println(">> " + msg)); } }
解説
・Consumer は「T型を受け取って、何か処理をする関数(値は返さない)」
・forEach() メソッドは、各要素に対して指定された処理を実行
・例では “Hello” → “>> Hello” といった形式で出力している
タグ: Java