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” といった形式で出力している

タグ:

TrackBack