Skip to content

Commit 1a18568

Browse files
committed
feat(lambda-expression): mais 2 exemplos e +
Criação de dois novos exemplos. Um com uma interface funcional nossa, para tentar deixar mais claro o conceito. Outro com a utilização de expressão lambda em listas no Java 8, também para tentar deixar mais claro onde se costuma utilizar. Uma melhoria no último exemplo para não confundir nada relacionado a Thread. Issue #20
1 parent e92637f commit 1a18568

4 files changed

Lines changed: 91 additions & 6 deletions

File tree

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

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,47 @@ include::{section-java-package}/lambdaexpression/LambdaExpression_AnonymousClass
4343
+
4444
Veja que no exemplo acima é instanciada uma `Thread` com uma instância anônima de `Runnable`. Na segunda parte, é feito a mesma coisa de forma muito mais simples utilizando uma expressão lambda.
4545

46+
. Expressões lambda são sempre utilizadas para criar instâncias de interfaces funcionais, ou seja, interfaces que possuem apenas um único método abstrato.
47+
+
48+
[source,java,indent=0]
49+
.{java-package}/lambdaexpression/LambdaExpression_FunctionalInterface.java
50+
----
51+
include::{section-java-package}/lambdaexpression/LambdaExpression_FunctionalInterface.java[tag=code]
52+
----
53+
+
54+
.Saída no console
55+
[source,console]
56+
----
57+
executei com classe anônima
58+
executei com expressão lambda
59+
----
60+
+
61+
Veja que no exemplo acima o mesmo método `executeEApresenteMensagem` é invocado duas vezes. Na primeira vez é passada uma nova classe anônima. Na segunda vez é passado uma expressão lambda.
62+
+
63+
Veja também que seria impossível criar uma expressão lambda caso a interface não fosse funcional, ou seja, tivesse mais de um método abstrato. Seria impossível para o compilador saber que o que está sendo implementado dentro da expressão lambda é o método `execute` da interface `Executavel`.
64+
65+
. Existem muitos métodos já disponíveis no Java 8 que se beneficiam da sintaxe de expressões lambda, como o `forEach` de listas.
66+
+
67+
[source,java,indent=0]
68+
.{java-package}/lambdaexpression/LambdaExpression_ForEach.java
69+
----
70+
include::{section-java-package}/lambdaexpression/LambdaExpression_ForEach.java[tag=code]
71+
----
72+
+
73+
.Saída no console
74+
[source,console]
75+
----
76+
1
77+
2
78+
3
79+
4
80+
5
81+
----
82+
+
83+
Veja que o novo método `forEach` executa a expressão lambda passada como parâmetro para cada item da lista, imprimindo todos no console. Veja também que essa expressão lambda recebe como parâmetro um número, que é o número da lista.
84+
+
85+
Neste caso, a interface funcional que está sendo implementada pela expressão lambda é chamada `Consumer`. Ela será explicada em detalhes em uma seção posterior, juntamente com outras interfaces funcionais padrões do Java 8. Nesta seção é importante apenas entender o que são as expressões lambda e como é sua sintaxe.
86+
4687
. Declarações de expressões lambda podem ser completas ou simplificadas.
4788
+
4889
[source,java,indent=0]
@@ -104,9 +145,9 @@ Perceba que o compilador identifica que a variável `x3` é alterada no final do
104145
include::{section-java-package}/lambdaexpression/LambdaExpression_TypeInference.java[tag=code]
105146
----
106147
+
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.
148+
No exemplo anterior, apenas o método `run` da interface funcional `Application` 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.
108149
+
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`.
150+
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 `Application`, pois o método `run` também retorna uma `String`.
110151
+
111152
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.
112153

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.j6toj8.lambda.lambdaexpression;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class LambdaExpression_ForEach {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
List<Integer> lista = Arrays.asList(1, 2, 3, 4, 5);
11+
lista.forEach((numero) -> { System.out.println(numero); });
12+
// end::code[]
13+
}
14+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.j6toj8.lambda.lambdaexpression;
2+
3+
public class LambdaExpression_FunctionalInterface {
4+
5+
// tag::code[]
6+
@FunctionalInterface
7+
interface Executavel { // interface funcional
8+
String execute(); // método funcional
9+
}
10+
11+
private static void executeEApresenteMensagem(Executavel executavel) {
12+
String mensagem = executavel.execute();
13+
System.out.println(mensagem);
14+
}
15+
16+
public static void main(String[] args) {
17+
18+
// com classe anônima
19+
executeEApresenteMensagem(new Executavel() {
20+
@Override
21+
public String execute() {
22+
return "executei com classe anônima";
23+
}
24+
});
25+
26+
// com expressão lambda
27+
executeEApresenteMensagem(() -> { return "executei com expressão lambda"; });
28+
// end::code[]
29+
}
30+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface Executavel {
99
}
1010

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

@@ -20,14 +20,14 @@ void rode(Executavel executavel) {
2020
}
2121

2222
// esse método também pode receber uma expressão lambda sem argumentos
23-
void rode(Runnable runnable) {
24-
runnable.run();
23+
void rode(Application application) {
24+
application.run();
2525
}
2626
}
2727

2828
public static void main(String[] args) {
2929
Executor executor = new Executor();
30-
executor.rode(() -> { return "executando"; }); // irá chamar o execute que recebe um Runnable
30+
executor.rode(() -> { return "executando"; }); // irá chamar o execute que recebe uma Application
3131
executor.rode(() -> { System.out.println("executando"); }); // irá chamar o execute que recebe um Executavel
3232
}
3333
// end::code[]

0 commit comments

Comments
 (0)