English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriais Básicos de Java

Controle de fluxo do Java

Array do Java

Java Orientação a Objetos (I)

Java Orientação a Objetos (II)

Java Orientação a Objetos (III)

Tratamento de Exceções Java

Lista (List) do Java

Fila (Queue) do Java

conjuntos Map do Java

conjuntos Set do Java

Java Entrada e Saída (I/)

Reader do Java/Writer

Outros tópicos do Java

Java 8 Interface funcional

Java 8 Novas funcionalidades

Interface funcional (Functional Interface) é uma interface que possui apenas um método abstrato, mas pode ter vários métodos não abstratos.

As interfaces funcionais podem ser convertidas implicitamente em expressões Lambda.

Expressões Lambda e referências a métodos (na verdade também são expressões Lambda).

Como definir uma interface funcional conforme abaixo:

@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

Então, pode-se usar uma expressão Lambda para representar uma implementação dessa interface (Nota: JAVA 8 Antes, geralmente era implementado com uma classe anônima):

GreetingService greetService1 message -System.out.println("Hello ") + message);

as interfaces funcionais podem suportar lambdas existentes de maneira amigável.

JDK 1.8 interfases funcionais existentes anteriormente:

  • java.lang.Runnable

  • java.util.concurrent.Callable

  • java.security.PrivilegedAction

  • java.util.Comparator

  • java.io.FileFilter

  • java.nio.file.PathMatcher

  • java.lang.reflect.InvocationHandler

  • java.beans.PropertyChangeListener

  • java.awt.event.ActionListener

  • javax.swing.event.ChangeListener

JDK 1.8 novas interfaces de função adicionadas:

  • java.util.function

java.util.function contém muitos classes, usadas para suportar programação funcional em Java, as interfaces funcionais no pacote são:

número de sérieinterface & descrição
1BiConsumer<T,U>

representa uma operação que aceita dois parâmetros de entrada e não retorna nenhum resultado

2BiFunction<T,U,R>

representa um método que aceita dois parâmetros de entrada e retorna um resultado

3BinaryOperator<T>

representa uma operação sobre dois operadores do mesmo tipo, que retorna um resultado do mesmo tipo

4BiPredicate<T,U>

representa um método booleano com dois parâmetros

5BooleanSupplier

representa o provedor de um resultado booleano

6Consumer<T>

representa uma operação que aceita um parâmetro de entrada e não retorna nenhum resultado

7DoubleBinaryOperator

representa uma operação sobre dois operadores de valor double, que retorna um resultado de valor double.

8DoubleConsumer

representa uma operação que aceita um parâmetro de valor double e não retorna nenhum resultado.

9DoubleFunction<R>

representa um método que aceita um parâmetro de valor double e retorna um resultado

10DoublePredicate

representa um método booleano com parâmetro double

11DoubleSupplier

representa o provedor de uma estrutura de valor double

12DoubleToIntFunction

Aceita um parâmetro do tipo double e retorna um resultado do tipo int.

13DoubleToLongFunction

Aceita um parâmetro do tipo double e retorna um resultado do tipo long

14DoubleUnaryOperator

Aceita um parâmetro do tipo double e retorna um valor do tipo double.

15Function<T,R>

Aceita um parâmetro de entrada e retorna um resultado.

16IntBinaryOperator

Aceita dois parâmetros do tipo int e retorna um valor do tipo int.

17IntConsumer

Aceita um parâmetro de entrada do tipo int, sem retornar nenhum valor.

18IntFunction<R>

Aceita um parâmetro de entrada do tipo int e retorna um resultado.

19IntPredicate

Aceita um parâmetro de entrada do tipo int e retorna um resultado do tipo boolean.

20IntSupplier

Sem parâmetros, retorna um resultado do tipo int.

21IntToDoubleFunction

Aceita um parâmetro do tipo int e retorna um resultado do tipo double.

22IntToLongFunction

Aceita um parâmetro do tipo int e retorna um resultado do tipo long.

23IntUnaryOperator

Aceita um parâmetro do tipo int e retorna um valor do tipo int.

24LongBinaryOperator

Aceita dois parâmetros do tipo long e retorna um valor do tipo long.

25LongConsumer

Aceita um parâmetro de entrada do tipo long, sem retornar nenhum valor.

26LongFunction<R>

Aceita um parâmetro de entrada do tipo long e retorna um resultado.

27LongPredicate

R aceita um parâmetro de entrada do tipo long e retorna um resultado do tipo boolean.

28LongSupplier

Sem parâmetros, retorna um valor do tipo long.

29LongToDoubleFunction

Aceita um parâmetro do tipo long e retorna um resultado do tipo double.

30LongToIntFunction

Aceita um parâmetro do tipo long e retorna um resultado do tipo int.

31LongUnaryOperator

Aceita um parâmetro do tipo long e retorna um valor do tipo long.

32ObjDoubleConsumer<T>

Aceita um parâmetro do tipo object e um parâmetro do tipo double, sem retornar nenhum valor.

33ObjIntConsumer<T>

Aceita um parâmetro do tipo object e um parâmetro do tipo int, sem retornar nenhum valor.

34ObjLongConsumer<T>

Aceita um parâmetro do tipo object e um parâmetro do tipo long, sem retorno.

35Predicate<T>

Aceita um parâmetro de entrada e retorna um valor booleano.

36Supplier<T>

Sem parâmetros, retorna um resultado.

37ToDoubleBiFunction<T,U>

Aceita dois parâmetros de entrada e retorna um valor do tipo double.

38ToDoubleFunction<T>

Aceita um parâmetro de entrada e retorna um valor do tipo double.

39ToIntBiFunction<T,U>

Aceita dois parâmetros de entrada e retorna um valor do tipo int.

40ToIntFunction<T>

Aceita um parâmetro de entrada e retorna um valor do tipo int.

41ToLongBiFunction<T,U>

Aceita dois parâmetros de entrada e retorna um valor do tipo long.

42ToLongFunction<T>

Aceita um parâmetro de entrada e retorna um valor do tipo long.

43UnaryOperator<T>

Aceita um parâmetro do tipo T e retorna um valor do tipo T.

Exemplo de interface funcional

A interface Predicate <T> é uma interface funcional, que aceita um parâmetro de entrada T e retorna um valor booleano.

Esta interface contém vários métodos padrão para combinar Predicate em lógicas complexas (por exemplo: e, ou, não).

Esta interface é usada para testar se um objeto é true ou false.

Podemos usar o seguinte exemplo (Java8para entender o uso da interface funcional Predicate <T>:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
public class Java8Tester {
   public static void main(String args[]){
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        
      // Predicate<Integer> predicate = n ->true
      // n é um parâmetro passado para o método test da interface Predicate
      // se n existir, o método test retorna true
        
      System.out.println("Imprimir todos os dados:");
        
      // passar o parâmetro n
      eval(list, n->true);
        
      // Predicate<Integer> predicate1 igual a n -> n%2 == 0
      // n é um parâmetro passado para o método test da interface Predicate
      // se n%2 Se 0, o método test retorna true
        
      System.out.println("Imprimir todos os números pares:");
      eval(list, n-> n%2 igual a 0 );
        
      // Predicate<Integer> predicate2 igual a n -> n > 3
      // n é um parâmetro passado para o método test da interface Predicate
      // se n for maior que 3 método test retorna true
        
      System.out.println("Saída maior que 3 todos os números:");
      eval(list, n-> n > 3 );
   }
    
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {
      for(Integer n: list) {
        
         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

Execute o script acima, o resultado será:

$ javac Java8Tester.java 
$ java Java8Tester
Saída de todos os dados:
1 
2 
3 
4 
5 
6 
7 
8 
9 
Saída de todos os números pares:
2 
4 
6 
8 
Saída maior que 3 Todos os números:
4 
5 
6 
7 
8 
9

Java 8 Novas funcionalidades