O Que É Uma Interface Funcional?
É hora de explorar em detalhes como lambdas são criadas em Java e qual é a relação das interfaces funcionais com elas.
Uma interface funcional pode ser utilizada para representar uma ação ou operação que pode ser executada. Em vez de criar uma classe inteira para uma tarefa simples, é possível definir uma interface com um único método que descreve a ação.
Exemplo de interface funcional:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
A anotação @FunctionalInterface é opcional, mas auxilia o compilador e os desenvolvedores ao garantir que a interface permaneça funcional e ao impedir a adição de métodos abstratos múltiplos.
Por que precisamos delas?
Na Stream API, interfaces funcionais são utilizadas para passar diferentes comportamentos para métodos que trabalham com coleções de dados.
Por exemplo, é possível passar uma condição de filtragem para um método que seleciona elementos específicos de uma lista ou fornecer uma operação para transformar cada elemento, como ocorre em métodos como filter() e map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
O método filter() utiliza uma interface funcional especial chamada Predicate<T> (que será abordada posteriormente), responsável por verificar se um elemento atende a uma determinada condição. Neste caso, a expressão lambda n -> n % 2 == 0 determina se um número é par. Se o número for divisível por 2 sem resto, ele permanece no stream.
Criando uma Interface Funcional Personalizada
Suponha que seja necessária uma interface para realizar operações aritméticas como adição ou subtração.
É possível criar uma interface funcional chamada ArithmeticOperation com um método apply que executa uma operação em dois números, a e b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Agora que você possui a interface, é possível utilizar expressões lambda para definir diferentes operações como adição e subtração:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
As expressões lambda (a, b) -> a + b e (a, b) -> a - b implementam o método apply da interface, realizando respectivamente a adição e a subtração. A primeira expressão lambda retorna a soma de dois números, enquanto a segunda retorna a diferença entre eles.
Essa abordagem oferece uma maneira flexível de utilizar diferentes operações aritméticas sem a necessidade de criar classes separadas para cada uma.
1. O que é uma interface funcional em Java?
2. Qual expressão lambda implementa corretamente a interface funcional a seguir?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
What are some examples of built-in functional interfaces in Java?
How do I use a lambda expression with a custom functional interface?
Can you explain how functional interfaces are used with the Stream API?
Awesome!
Completion rate improved to 2.33
O Que É Uma Interface Funcional?
Deslize para mostrar o menu
É hora de explorar em detalhes como lambdas são criadas em Java e qual é a relação das interfaces funcionais com elas.
Uma interface funcional pode ser utilizada para representar uma ação ou operação que pode ser executada. Em vez de criar uma classe inteira para uma tarefa simples, é possível definir uma interface com um único método que descreve a ação.
Exemplo de interface funcional:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
A anotação @FunctionalInterface é opcional, mas auxilia o compilador e os desenvolvedores ao garantir que a interface permaneça funcional e ao impedir a adição de métodos abstratos múltiplos.
Por que precisamos delas?
Na Stream API, interfaces funcionais são utilizadas para passar diferentes comportamentos para métodos que trabalham com coleções de dados.
Por exemplo, é possível passar uma condição de filtragem para um método que seleciona elementos específicos de uma lista ou fornecer uma operação para transformar cada elemento, como ocorre em métodos como filter() e map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
O método filter() utiliza uma interface funcional especial chamada Predicate<T> (que será abordada posteriormente), responsável por verificar se um elemento atende a uma determinada condição. Neste caso, a expressão lambda n -> n % 2 == 0 determina se um número é par. Se o número for divisível por 2 sem resto, ele permanece no stream.
Criando uma Interface Funcional Personalizada
Suponha que seja necessária uma interface para realizar operações aritméticas como adição ou subtração.
É possível criar uma interface funcional chamada ArithmeticOperation com um método apply que executa uma operação em dois números, a e b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Agora que você possui a interface, é possível utilizar expressões lambda para definir diferentes operações como adição e subtração:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
As expressões lambda (a, b) -> a + b e (a, b) -> a - b implementam o método apply da interface, realizando respectivamente a adição e a subtração. A primeira expressão lambda retorna a soma de dois números, enquanto a segunda retorna a diferença entre eles.
Essa abordagem oferece uma maneira flexível de utilizar diferentes operações aritméticas sem a necessidade de criar classes separadas para cada uma.
1. O que é uma interface funcional em Java?
2. Qual expressão lambda implementa corretamente a interface funcional a seguir?
Obrigado pelo seu feedback!