O que o operador de seta '->' faz em Java?

170

Enquanto procurava por algum código, me deparei com o operador de seta, o que exatamente ele faz? Eu pensei que Java não tinha um operador de seta.

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

Detalhes : Java 6, Apache Commons Collection, IntelliJ 12

Atualização / resposta: Acontece que o IntelliJ 12 suporta Java 8, que suporta lambdas, e está "dobrando" Predicados e exibindo-os como lambdas. Abaixo está o código "desdobrado".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});
Mike Rylander
fonte
5
Observe que o cenário exato é o IntelliJ processando o código existente como uma expressão lambda para facilitar a leitura. O código real não é uma expressão lambda.
Thorbjørn Ravn Andersen

Respostas:

125

Isso faz parte da sintaxe das novas expressões lambda, a serem introduzidas no Java 8. Existem alguns tutoriais on-line para entender o jeito, aqui está um link para um. Basicamente, o ->separa os parâmetros (lado esquerdo) da implementação (lado direito).

A sintaxe geral para usar expressões lambda é

(Parâmetros) -> {Body} onde o '->' separa os parâmetros e o corpo da expressão lambda.

Os parâmetros estão entre parênteses, da mesma maneira que para os métodos, e o corpo da expressão lambda é um bloco de código entre chaves.

Óscar López
fonte
10
O OP usando o JDK 6, de modo que este é realmente apenas IntelliJ dobrar código como por resposta @antonm abaixo
Sean Landsman
6
O @SeanLandsman OP pode estar usando Java 6, mas na pergunta ele afirma que encontrou esse código em outro lugar. Quanto ao porquê de IntelliJ não está relatando um erro, isso é um mistério (talvez lá é uma versão Java 7 instalado algum lugar no sistema de OP). Mas essa é a sintaxe da expressão lambda em Java, não há dúvida sobre isso.
Óscar López
37

Essa também é útil quando você deseja implementar uma interface funcional

Runnable r = ()-> System.out.print("Run method");

é equivalente a

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
fonte
por que esse recurso é fornecido?
Akaisteph7
1
@ Akaisteph7 quando você não deseja definir um método porque descobre que apenas um chamador irá chamar esse método. Nesses casos, faz sentido NÃO definir o método em um local separado, em vez de passar no corpo do método, leia sobre o método anônimo seguido por lambda.
Vivek Shukla
30

Acredito que esta flecha existe por causa do seu IDE. O IntelliJ IDEA faz isso com algum código. Isso é chamado de dobragem de código. Você pode clicar na seta para expandi-la.

Anton-M
fonte
36
@DavidConrad Não, não está errado. O IntelliJ de fato dobra implementações embutidas de interfaces funcionais para se parecer com lambdas.
balpha
12
Veja a pergunta: "Detalhes: Java 6, Apache Commons Collection, IntelliJ 12" Lambda em java 6 ???
Anton-H
13

É uma expressão lambda.

Isso significa que, a partir de listOfCars, arg0 é um dos itens dessa lista. Com esse item, ele fará, daí o ->, o que estiver dentro dos colchetes.

Neste exemplo, ele retornará uma lista de carros que se encaixam na condição

Car.SEDAN == ((Car)arg0).getStyle();
thomas-simples
fonte
2

Novo operador para expressão lambda adicionado no java 8

A expressão lambda é o caminho mais curto para escrever métodos.
É indiretamente usado para implementar interface funcional

Sintaxe primária: (parâmetros) -> {declarações; }

Existem algumas regras básicas para escrever expressões lambda eficazes que você deve conhecer.

Manasi
fonte