Skip to content

Commit 85f4d6c

Browse files
committed
refactor(lambda-expression): melhores exemplos
Exemplo de expressão lambda compilando sem a utilização de parênteses. Alteração da explicação de Type Inference para tentar deixar mais claro. Issue #20
1 parent 1920df8 commit 85f4d6c

3 files changed

Lines changed: 21 additions & 11 deletions

File tree

book/04-lambda/sections/02-lambda-expression.asc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,11 @@ Perceba que o compilador identifica que a variável `x3` é alterada no final do
104104
include::{section-java-package}/lambdaexpression/LambdaExpression_TypeInference.java[tag=code]
105105
----
106106
+
107-
No exemplo anterior, apenas o método `corra` da interface funcional `Piloto` retorna uma `String`, por isso o compilador sabe que deve chamá-lo.
107+
No exemplo anterior, apenas o método `run` da interface funcional `Runnable` retorna uma `String`, enquanto o método `execute` da interface funcional `Executavel` não retorna nada (`void`). Isso é diferença suficiente para o compilador saber qual método chamar cada vez que `rode` é invocado.
108+
+
109+
Na primeira chamada ao método `rode`, como a expressão lambda passada retorna uma `String`, o compilador entende que essa expressão lambda é uma implementação da interface `Runnable`, pois o método `run` também retorna uma `String`.
110+
+
111+
Na segunda chamada ao método `rode`, como a expressão lambda não retorna nada (apenas imprime a `String` `"executando"`), o compilador entende que essa expressão lambda é uma implementação da interface `Executavel`, pois o método `execute` também não retorna nada.
108112

109113
. Se não for possível descobrir o tipo da expressão lambda, ocorre erro de compilação.
110114
+

src/org/j6toj8/lambda/lambdaexpression/LambdaExpression_Parenthesis.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ public static void main(String[] args) {
1616
Supplier<Double> elevar2aoQuadrado = -> Math.pow(2, 2);
1717

1818
// COMPILA - parênteses vazios quando não há variáveis
19-
Supplier<Double> elevar2aoQuadrado = () -> Math.pow(2, 2);
19+
Supplier<Double> elevar2aoQuadrado = () -> Math.pow(2, 2);
20+
21+
// COMPILA - sem parênteses quando há apenas uma variável e não escrevemos seu tipo
22+
UnaryOperator<Double> elevarAoQuadrado2 = x -> Math.pow(x, 2);
2023
// end::code[]
2124
}
2225
}

src/org/j6toj8/lambda/lambdaexpression/LambdaExpression_TypeInference.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,31 @@ public class LambdaExpression_TypeInference {
44

55
// tag::code[]
66
@FunctionalInterface
7-
interface Corredor {
8-
void corra();
7+
interface Executavel {
8+
void execute(); // método funcional sem argumentos
99
}
1010

1111
@FunctionalInterface
12-
interface Piloto {
13-
String corra();
12+
interface Runnable {
13+
String run(); // método funcional também sem argumentos
1414
}
1515

1616
static class Executor {
17-
void execute(Corredor corredor) {
18-
corredor.corra();
17+
// esse método pode receber uma expressão lambda sem argumentos
18+
void rode(Executavel executavel) {
19+
executavel.execute();
1920
}
2021

21-
String execute(Piloto piloto) {
22-
return piloto.corra();
22+
// esse método também pode receber uma expressão lambda sem argumentos
23+
void rode(Runnable runnable) {
24+
runnable.run();
2325
}
2426
}
2527

2628
public static void main(String[] args) {
2729
Executor executor = new Executor();
28-
String s = executor.execute(() -> "execute");
30+
executor.rode(() -> { return "executando"; }); // irá chamar o execute que recebe um Runnable
31+
executor.rode(() -> { System.out.println("executando"); }); // irá chamar o execute que recebe um Executavel
2932
}
3033
// end::code[]
3134
}

0 commit comments

Comments
 (0)