Skip to content

Commit 1920df8

Browse files
committed
feat(functional-interfaces): novos exemplos
Criação de dois novos exemplos para mostrar: que o retorno nem sempre precisa ser void; que é possível implementar uma interface funcional com uma classe, mesmo que não seja feito para ser utilizado dessa forma. Alteração dos exemplos anteriores para uma interface que faz mais sentido de ser funcional: Executavel (parecida com Runnable do Java). Issue #19
1 parent 815ef3b commit 1920df8

10 files changed

Lines changed: 80 additions & 26 deletions

book/04-lambda/sections/01-functional-interfaces.asc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Define and write functional interfaces and describe the interfaces of the java.u
1010
Definir e escrever interfaces funcionais e descrever as interfaces do pacote java.util.function.
1111
--------------------------------------------------
1212

13+
Interfaces funcionais são um novo tipo de Interface do Java. Aqui serão apresentados os conceitos. Na seção de Expressões Lambda será possível ver como utilizá-las.
14+
1315
. Interfaces Funcionais são aquelas que possuem apenas um método abstrato, chamado de "método funcional".
1416
. É recomendada a utilização da anotação @FunctionalInterface, mas não obrigatório.
1517
+
@@ -69,6 +71,24 @@ include::{section-java-package}/functionalinterfaces/FunctionalInterfaces_Interf
6971
include::{section-java-package}/functionalinterfaces/FunctionalInterfaces_ClassCompilationError.java[tag=code]
7072
----
7173

74+
. Os métodos funcionais podem ter qualquer tipo de retorno.
75+
+
76+
[source,java,indent=0]
77+
.{java-package}/functionalinterfaces/FunctionalInterfaces_ReturnType.java
78+
----
79+
include::{section-java-package}/functionalinterfaces/FunctionalInterfaces_ReturnType.java[tag=code]
80+
----
81+
82+
. Interfaces funcionais são feitas com o intuito de serem utilizadas em expressões lambda, mas o código também irá compilar normalmente caso uma classe a implemente.
83+
+
84+
[source,java,indent=0]
85+
.{java-package}/functionalinterfaces/FunctionalInterfaces_Implement.java
86+
----
87+
include::{section-java-package}/functionalinterfaces/FunctionalInterfaces_Implement.java[tag=code]
88+
----
89+
+
90+
Esse é apenas um exemplo para você saber que essa implementação não gera erro de compilação, mas *não* utilize interfaces funcionais dessa forma. Na seção de Expressões Lambda você verá como as interfaces funcionais devem ser utilizadas na prática.
91+
7292
==== Interfaces Funcionais do pacote `java.util.function`
7393

7494
As interfaces descritas aqui estão disponíveis no pacote `java.util.function`. Nesta seção serão apresentadas apenas suas definições, pois há posteriormente uma seção específica para tratar dos exemplos de cada uma.

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_Basic.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ public class FunctionalInterfaces_Basic {
44

55
// tag::code[]
66
@FunctionalInterface // a anotação não é obrigatória
7-
interface Corredor { // interface funcional
8-
void corra(); // método funcional
7+
interface Executavel { // interface funcional
8+
void execute(); // método funcional
99
}
1010
// end::code[]
1111
}

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_ClassCompilationError.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ public class FunctionalInterfaces_ClassCompilationError {
44

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

1111
@FunctionalInterface
12-
class Piloto implements Corredor { // NÃO COMPILA!
12+
class Piloto { // NÃO COMPILA!
1313
// apenas interfaces podem ser anotadas com @FunctionalInterface
1414
}
1515
// end::code[]

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_DefaultStatic.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@ public class FunctionalInterfaces_DefaultStatic {
44

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

1010
// métodos adicionais static são permitidos
11-
static void corram(Corredor... corredores) {
12-
for (Corredor corredor : corredores) {
13-
corredor.corra();
11+
static void execute(Executavel... executaveis) {
12+
for (Executavel executavel : executaveis) {
13+
executavel.execute();
1414
}
1515
}
1616

1717
// métodos adicionais default são permitidos
18-
default String pule() {
19-
return "Corredor pulando";
18+
default void executeDuasVezes() {
19+
execute();
20+
execute();
2021
}
2122
}
2223
// end::code[]

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_Extends.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ public class FunctionalInterfaces_Extends {
44

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

1111
@FunctionalInterface
12-
interface Piloto extends Corredor {
12+
interface Aplicacao extends Executavel {
1313
// também é uma interface funcional
1414
}
1515
// end::code[]

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_ExtendsNewMethod.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ public class FunctionalInterfaces_ExtendsNewMethod {
44

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

11-
interface Piloto extends Corredor {
12-
// NÃO é uma interface funcional, pois possui 2 métodos abstratos: corra (herdado) e pilote.
13-
void pilote();
11+
interface Aplicacao extends Executavel {
12+
// NÃO é uma interface funcional, pois possui 2 métodos abstratos: execute (herdado) e inicie.
13+
void inicie();
1414
}
1515
// end::code[]
1616
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.j6toj8.lambda.functionalinterfaces;
2+
3+
public class FunctionalInterfaces_Implement {
4+
5+
// tag::code[]
6+
@FunctionalInterface
7+
interface Executavel { // interface funcional
8+
String execute(); // método funcional
9+
}
10+
11+
class Pessoa implements Executavel {
12+
// COMPILA!
13+
// interfaces funcionais, como Corredor, não foram feitas para serem implementadas dessa forma
14+
// porém é possível e o código compila normalmente
15+
@Override
16+
public String execute() {
17+
return "Executando";
18+
}
19+
}
20+
// end::code[]
21+
22+
}

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_InterfaceCompilationError.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ public class FunctionalInterfaces_InterfaceCompilationError {
44

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

1111
@FunctionalInterface
12-
interface Piloto extends Corredor { // NÃO COMPILA!
12+
interface Aplicacao extends Executavel { // NÃO COMPILA!
1313
// não pode ser anotada como funcional, pois possui 2 métodos abstratos
14-
void pilote();
14+
void inicie();
1515
}
1616
// end::code[]
1717
}

src/org/j6toj8/lambda/functionalinterfaces/FunctionalInterfaces_OverrideObject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ public class FunctionalInterfaces_OverrideObject {
44

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

1010
// sobrescrevendo métodos de Object
1111
@Override
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.j6toj8.lambda.functionalinterfaces;
2+
3+
public class FunctionalInterfaces_ReturnType {
4+
5+
// tag::code[]
6+
@FunctionalInterface
7+
interface Executavel { // interface funcional
8+
String execute(); // método funcional com retorno
9+
}
10+
// end::code[]
11+
}

0 commit comments

Comments
 (0)