Home > Java > javaTutorial > Generic Functional Interfaces

Generic Functional Interfaces

Mary-Kate Olsen
Release: 2025-01-12 09:30:46
Original
441 people have browsed it

Interfaces Funcionais Genéricas

Main concepts

  • Lambda expressions cannot be generic: You cannot specify type parameters directly in a lambda expression.
  • Functional interfaces can be generic: The target type of a lambda expression is determined by the type arguments specified in the functional interface reference.
  • Code reuse: Generic interfaces eliminate the need to create multiple functional interfaces for different types of data, allowing you to reuse logic with different types.

Practical example: SomeTest generic functional interface
The SomeTest generic interface can be used to implement lambdas with different types (e.g. Integer, Double, String).

Code

// 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.");
        }
    }
}

Copy after login

Exit

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

Copy after login

Explanation of the example
Generic interface definition:

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

Copy after login

T is the generic type that will be replaced by specific types (Integer, Double, String, etc.).

Use of lambda expressions:

  • The first lambda (isFactor) checks whether an integer is divisible by another.
  • The second lambda (isFactorD) performs the same operation, but with numbers of type Double.
  • The third lambda (isIn) checks if a string contains another string.

Reuse of the same interface:
The SomeTest interface is used with different data types (Integer, Double, String), demonstrating the flexibility of generics.

Benefits of Generic Functional Interfaces

  • Redundant code reduction: A single generic interface replaces several specific ones.
  • Flexibility: Adaptation to different types of data with the same logical behavior.
  • Compatibility with lambda expressions: Allows you to build reusable and more concise lambdas.

Suggested exercise
Redesign the previously mentioned NumericFunc functional interface as a generic interface. Use it to perform operations such as calculating the square of a number or checking whether a number is even.

Full Example: Refactoring NumericFunc as Generic

// 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)) ;

    }
}

Copy after login

Output:

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

The above is the detailed content of Generic Functional Interfaces. For more information, please follow other related articles on the PHP Chinese website!

source:dev.to
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template