O operador de seta -> em Java
- Como usar o operador Arrow em Java
- Operador de seta em coleções Java
- Operador de seta em Java Thread
 
Este tutorial apresenta o que o operador de seta (->) faz em Java e também lista alguns códigos de exemplo para entender o tópico.
No Java 8, um novo recurso de expressão lambda foi adicionado e, ao mesmo tempo, o operador de seta passou a existir em Java, o qual é usado para formar a expressão lambda. Ele separa os argumentos do corpo da expressão.
(parameters) -> {
  statements;
} // Lambda expression having arrow
A expressão lambda foi introduzida no Java 8 e pode ser usada no lugar da classe anônima no Java para tornar o código mais conciso e legível.
Abaixo está um exemplo de como criamos uma classe anônima em Java antes do Java 8.
Runnable r = new Runnable() {
  @Override
  public void run() {
    System.out.print("Run method");
  }
};
E é assim que podemos implementar a tarefa acima usando a expressão lambda em Java 8.
Runnable r = () -> System.out.print("Run method");
Vamos começar com alguns exemplos para entender o uso de operadores lambda e seta também.
Como usar o operador Arrow em Java
Neste exemplo, usamos o operador de seta para criar uma expressão lambda que implementa o método draw() da interface Drawable. Veja o exemplo abaixo.
interface Drawable {
  public void draw();
}
public class Main {
  public static void main(String[] args) {
    int width = 20;
    // arrow operator
    Drawable d2 = () -> {
      System.out.println("Drawing width:  " + width);
    };
    d2.draw();
  }
}
Produção:
Drawing width:  20
Como a expressão lambda é uma super maneira de criar código conciso com uma abordagem funcional, podemos usá-la de várias maneiras no código Java. Vamos ver alguns exemplos onde podemos aplicá-lo.
Operador de seta em coleções Java
Neste exemplo, filtramos os dados ArrayList usando uma expressão lambda. Usamos a API stream e o método filter() para obter o resultado desejado. Você pode notar como é fácil criar código usando lambda em vez de código não lambda. Veja o exemplo abaixo.
package javaexample;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
class Product {
  int id;
  String name;
  float price;
  public Product(int id, String name, float price) {
    this.id = id;
    this.name = name;
    this.price = price;
  }
}
public class Main {
  public static void main(String[] args) {
    List<Product> list = new ArrayList<Product>();
    list.add(new Product(1, "Samsung S5", 17000));
    list.add(new Product(3, "Iphone 12", 100500));
    list.add(new Product(2, "Sony Xperia", 25000));
    // using arrow to filter data
    Stream<Product> filtered_data = list.stream().filter(p -> p.price > 17000);
    filtered_data.forEach(product -> System.out.println(product.name + ": " + product.price));
  }
}
Produção:
Iphone 12: 100500.0
Sony Xperia: 25000.0
Operador de seta em Java Thread
Este é outro uso da expressão lambda, onde a usamos para implementar o método run() da interface executável. Como Runnable é uma interface de método único, é fácil usar uma expressão lambda. Veja o exemplo abaixo.
package javaexample;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Main {
  public static void main(String[] args) {
    // using arrow
    Runnable r = () -> {
      System.out.println("Thread is running...");
    };
    Thread t2 = new Thread(r);
    t2.start();
  }
}
Produção:
Thread is running...