ホームページ >Java >&#&チュートリアル >汎用関数インターフェース

汎用関数インターフェース

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 09:30:46490ブラウズ

Interfaces Funcionais Genéricas

主要概念

  • ラムダ式はジェネリックにはできません: ラムダ式で型パラメータを直接指定することはできません。
  • 関数インターフェイスはジェネリックにすることができます。 ラムダ式のターゲット型は、関数インターフェイスのリファレンスで指定された型引数によって決定されます。
  • コードの再利用: 汎用インターフェイスを使用すると、さまざまなタイプのデータに対して複数の機能インターフェイスを作成する必要がなくなり、さまざまなタイプのロジックを再利用できます。

実践例: SomeTest 汎用関数インターフェース
SomeTest 汎用インターフェイスを使用して、さまざまな型 (Integer、Double、String など) のラムダを実装できます。

コード

// Interface funcional genérica com dois parâmetros que retorna um boolean
interface SomeTest<T> {
    boolean test(T n, T m);
}

public class GenericFunctionalInterfaceDemo {
    public static void main(String[] args) {
        // Expressão lambda para verificar se um inteiro é fator de outro
        SomeTest<Integer> isFactor = (n, d) -> (n % d) == 0;
        if (isFactor.test(10, 2)) {
            System.out.println("2 is a factor of 10");
        }

        // Expressão lambda para verificar se um Double é fator de outro
        SomeTest<Double> isFactorD = (n, d) -> (n % d) == 0;
        if (isFactorD.test(212.0, 4.0)) {
            System.out.println("4.0 is a factor of 212.0");
        }

        // Expressão lambda para verificar se uma string faz parte de outra
        SomeTest<String> isIn = (a, b) -> a.indexOf(b) != -1;
        String str = "Generic Functional Interface";
        System.out.println("Testing string: " + str);
        if (isIn.test(str, "face")) {
            System.out.println("'face' is found.");
        } else {
            System.out.println("'face' not found.");
        }
    }
}

終了

2 is a factor of 10
4.0 is a factor of 212.0
Testing string: Generic Functional Interface
'face' is found.

例の説明
汎用インターフェース定義:

interface SomeTest<T> {
    boolean test(T n, T m);
}

T は、特定の型 (Integer、Double、String など) に置き換えられるジェネリック型です。

ラムダ式の使用:

  • 最初のラムダ (isFactor) は、整数が別の整数で割り切れるかどうかをチェックします。
  • 2 番目のラムダ (isFactorD) は同じ演算を実行しますが、Double 型の数値を使用します。
  • 3 番目のラムダ (isIn) は、文字列に別の文字列が含まれているかどうかをチェックします。

同じインターフェースの再利用:
SomeTest インターフェイスはさまざまなデータ型 (Integer、Double、String) で使用され、ジェネリックスの柔軟性を示しています。

汎用関数インターフェースの利点

  • 冗長コードの削減: 単一の汎用インターフェースが複数の特定のインターフェースを置き換えます。
  • 柔軟性: 同じ論理動作で異なるタイプのデータに適応します。
  • ラムダ式との互換性: 再利用可能でより簡潔なラムダを構築できます。

推奨される運動
前述の NumericFunc 関数インターフェイスを汎用インターフェイスとして再設計します。これを使用して、数値の 2 乗を計算したり、数値が偶数かどうかを確認したりするなどの操作を実行します。

完全な例: NumericFunc をジェネリックとしてリファクタリングする

// Interface funcional genérica com um parâmetro e um retorno
interface NumericFunc<T> {
    T apply(T n);
}

public class GenericNumericFuncDemo {
    public static void main(String[] args) {
        // Lambda para calcular o quadrado de um número inteiro
        NumericFunc<Integer> square = (n) -> n * n;
        System.out.println("Quadrado de 5: " + square.apply(5)); // Saída: 25

        // Lambda para calcular o quadrado de um número Double
        NumericFunc<Double> squareDouble = (n) -> n * n;
        System.out.println("Quadrado de 3.14: " + squareDouble.apply(3.14)); // Saída: 9.8596

        // Lambda para verificar se um número é par (retorna "Par" ou "Ímpar")
        NumericFunc<Integer> isEven = (n) -> (n % 2 == 0) ? n  :  -1;
        System.out.println("Resultado Numero pares de : Resultado com multiplos valores "  + isEven.apply(15)) ;

    }
}

出力:

Quadrado de 5: 25
Quadrado de 3.14: 9.8596
Resultado Número pares de : Resultado com múltiplos valores -1

以上が汎用関数インターフェースの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。