JavaRush /Blogue Java /Random-PT /Pausa para café #182. Interfaces Funcionais em Java

Pausa para café #182. Interfaces Funcionais em Java

Publicado no grupo Random-PT
Fonte: DZone Aqui está uma visão geral das interfaces funcionais em Java: propósito, exemplos, expressões lambda e uma lista de interfaces predefinidas. Pausa para café #182.  Interfaces Funcionais em Java - 1Como uma linguagem de programação orientada a objetos, Java anteriormente não podia ter funções independentes porque tudo, exceto alguns tipos de dados e métodos primitivos na linguagem, girava em torno de classes e objetos. No entanto, Java 8 introduziu um novo conceito chamado Interface Funcional e também alguns outros recursos como Expressões Lambda, API de Tempo, API de Stream e assim por diante. O que são essas interfaces funcionais e como defini-las? Vamos descobrir!

O que é uma interface?

Uma interface é um conjunto de regras que determinam a interação dos elementos do sistema. Também é conhecido como o esboço de uma classe contendo métodos abstratos e constantes estáticas. Uma interface pode conter um ou mais métodos abstratos. As interfaces também permitem definir requisitos para classes, ou seja, quais métodos são exigidos da classe. Simplificando, uma interface é como um contrato que deve ser respeitado por todas as classes de implementação. Aqui está um exemplo:
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
Se a classe que implementa a interface não declarar todos os métodos da interface, o código não será executado e gerará um erro: “ erro : A1 não é abstrato e não substitui um método abstrato em A1. " (erro: A1 não é abstrato e não substitui um método abstrato em A1). Antes do JDK 8, as interfaces não podiam definir implementações, mas agora implementações padrão podem ser adicionadas para métodos de interface. Também podemos definir métodos estáticos e padrão, que pode chamar sem um objeto na interface As interfaces são usadas principalmente para obter herança múltipla e acoplamento fraco no código. Agora que temos uma compreensão clara das interfaces, vamos ver o que é uma interface funcional e como ela funciona.

O que é uma interface funcional?

A interface funcional também é conhecida como interface Single Abstract Method (SAM). Como o nome sugere, pode ter no máximo um método abstrato. Uma interface funcional pode ter vários métodos estáticos e padrão com uma implementação, bem como um método abstrato adicional. Para marcar uma interface como funcional, utiliza-se a anotação @FunctionalInterface . É necessário evitar declarar erroneamente métodos adicionais. O que torna a interface funcional tão popular é a capacidade de usar expressões lambda para criar interfaces sem usar implementações de classe anônimas e complicadas. O uso da palavra-chave abstract em interfaces funcionais é opcional porque os métodos definidos em uma interface são abstratos por padrão.

O que são expressões lambda?

Uma expressão lambda é um método sem nome ou anônimo que não é executado por conta própria, mas é usado para implementar certos métodos de uma interface funcional. É definido da seguinte forma:
(parameter list) -> lambda body
O operador de seta ( -> ) que você vê no código é conhecido como operador lambda. Por exemplo, se tivermos o seguinte método:
double getGoldenRatioValue() {
return 1.61803;
}
Usando uma expressão lambda, podemos escrever assim:
() -> 1.61803
Como você pode ver, o método na função lambda não possui parâmetros, portanto o lado esquerdo da instrução está vazio. Como o lado direito determina a ação, neste exemplo ele retornará o valor da proporção áurea: 1,61803. Antes do Java 8, implementar interfaces ou criar objetos de classe interna era crucial, mas com o Java 8, tudo o que precisamos fazer agora é atribuir expressões lambda a interfaces funcionais.

Exemplos de interfaces funcionais

Para criar interfaces funcionais, você pode usar a anotação @FunctionalInterface ou usar interfaces funcionais predefinidas do Java.

Exemplo 1

  • Primeiro, marcaremos @FunctionalInterface e criaremos uma interface chamada MyInterface que é chamada pelo método abstrato getGoldenRationValue() .
  • Em seguida, criaremos uma classe pública main para executar o método.
  • Para usar uma expressão lambda em uma interface funcional, declararemos uma referência a MyInterfaceDemo e então atribuiremos a expressão lambda a essa referência.
  • Por fim, imprimiremos o valor da proporção áurea usando a interface de referência.
import java.lang.FunctionalInterface;

// Creation и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
Conclusão:
Valor da Proporção Áurea = 1,61803

Exemplo 2

  • Neste exemplo, usaremos a interface de função predefinida ToDoubleFunction , que recebe um argumento T e retorna um double como saída.
  • ToDoubleFuntion contém um método abstrato chamado applyasDouble() .
  • Por fim, imprimimos todo o comprimento da mensagem, incluindo espaços.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
Conclusão:
54,0

Lista de interfaces funcionais pré-instaladas

Agora que sabemos como definir interfaces funcionais, vamos ver quantas interfaces funcionais predefinidas (integradas) existem. Existem 4 tipos principais de interfaces funcionais que podem ser implementadas em diferentes situações: Consumidor , Predicado , Função e Fornecedor . Entre essas quatro interfaces, Consumer , Function e Predicate possuem interfaces de função adicionais. Aqui está uma lista de todas as interfaces integradas ou predefinidas em Java. Observação. T, U e R mencionados na tabela abaixo representam o tipo do primeiro argumento (T), segundo argumento (U) e resultado (R) da operação respectivamente.
Interface Tipo
Executável
BiConsumidor(T, U) T, você→
BiFunção (T, U, R) T, você → R
Operador Binário T, T <→ R
BiPredicado<T, U> T, U → booleano
Fornecedor booleano → booleano
Consumidor T →
Operador DuploBinário duplo, duplo → duplo
Consumidor Duplo duplo →
Função Dupla duplo → R
Predicado Duplo duplo → booleano
Fornecedor Duplo booleano →
Função DoubleToInt duplo → int
Função DoubleToLong duplo → longo
Operador DuploUnário duplo → duplo
Função<T, R> T → R
Operador IntBinário int → int
Consumidor Interno interno →
Função Int interno → R
IntPredicado int → booleano
Fornecedor Interno → interno
IntToDoubleFunction int → duplo
IntToLongFunction int → longo
Operador IntUnário int → int
Operador Binário Longo longo, longo → longo
LongConsumidor longo →
Função Longa longo → R
LongPredicado longo →
Fornecedor Longo → longo
Função LongToDouble longo → duplo
Função LongToInt longo → int
Operador Unário Longo longo → longo
ObjDoubleConsumidor T, duplo →
ObjIntConsumidor T, int →
ObjLongConsumidor T, longo →
Predicado T → booleano
Fornecedor →T
ToDoubleBiFunction<T, U> T, U → duplo
ToDoubleFunction T → duplo
ToIntBiFunction<T, U> T, você → int
ToIntFunction T → int
ToLongBiFunction<T, U> T, U → longo
ToLongFunction T → longo
Operador Unário T → T

Vamos resumir

Algumas lições importantes a serem lembradas desta postagem:
  • A interface funciona como um mecanismo de abstração.
  • Uma interface funcional pode ter vários métodos estáticos e padrão com uma implementação, bem como um método abstrato adicional.
  • Os métodos definidos dentro de uma interface funcional são abstratos por padrão, portanto, o uso da palavra-chave abstract não é mais necessário.
  • Uma expressão lambda é um método anônimo que não é executado sozinho, mas é usado para implementar certos métodos de uma interface funcional.
  • Para criar interfaces funcionais, você pode usar a anotação @FunctionalInterface ou usar interfaces funcionais predefinidas do Java.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION