Slides

Propaganda
JAVA 8: POR QUE MEU DIA VAI
FICAR MELHOR COM ELE?
by Ulisses Telemaco
Tks Wikipedia
UM POUCO DE HISTÓRIA…
JDK
Alpha and Beta!
(1995)
J2SE 5.0
JDK 1.1 !
Tiger
(1997)
(2004)
J2SE 1.3!
Kestrel !
(2000)
Generics!
Annotations!
Enumerations!
varargs!
static imports!
new for!
…
Java SE 7!project coin
Dolphin !
(2011)
J2SE 1.2!
Playground !
(1998) J2SE 1.4!
Merlin !
JDK 1.0 !
(2002)
(1996)
Tks Wikipedia
Java SE 6!
Mustang !
(2006)
Spider
Java
SE
8 patas
JSR 337
teia (net)
(2014)
8
Novidades
Java 8
Linguagem
•
•
•
•
•
•
•
Function <NEW>!
Stream <NEW>!
Time <NEW>!
Collections!
Concurrency!
IO/NIO!
+…
APIs
•
•
•
•
•
•
Lambdas
Interfaces Funcionais!
Default Method!
Generic Inference (better)!
Type annotation!
+…
Infraestrutura
•
•
•
Nashorn!
Metaspace!
+…
LAMBDA
£ Sintaxe!
£ Quando usar? !
£ Onde usar?
() -> {}
(lambda args) ->
{ lambda body}
(int x, int y) -> {return x + y;};
(int x, int y) -> {return x + y;};
Lista de parâmetros
separadas por vírgula
Separador
Lambda
(int x, int y) -> {return x + y;};
Lista de parâmetros
separadas por vírgula
Separador
Lambda
(int x, int y) -> {return x + y;};
Lista de parâmetros
separadas por vírgula
Bloco da função
lambda…
+ LAMBDAS…
(int x) -> { return 2*x ; };
+ LAMBDAS…
(int x) -> { return 2*x ; };
(x) -> {return 2*x ; };
+ LAMBDAS…
(int x) -> { return 2*x ; };
(x) -> {return 2*x ; };
(x) -> 2*x;
+ LAMBDAS…
(int x) -> { return 2*x ; };
(x) -> {return 2*x ; };
(x) -> 2*x;
x -> 2*x ;
LAMBDA
R Sintaxe!
£ Quando usar? !
£ Onde usar?
N
EW
!!
!
FUNCTIONAL!
INTERFACE
@FunctionalInterface
1ª INTERFACE FUNCIONAL
@FunctionalInterface
public interface MyFuncInterface {!
! public void myMethod();!
}
2ª INTERFACE FUNCIONAL???
Erro
@FunctionalInterface
public interface AnotherInterface {!
! public void oneMethod();!
public void anotherMethod();!
}
new MyFuncInterface() {!
@Override
public void myMethod() {
System.out.println("XPTO!");
}!
};
() -> { System.out.println("XPTO!”); };
class MyClass {!
public void method( MyFuncInterface mfi ) { ... } !
}
a.method( new MyFuncInterface() {!
@Override
public void myMethod() {
System.out.println("XPTO!");
}
} );
a.method( () -> { System.out.println("XPTO!"); } );
new SomeInterface() {!
@Override!
public someType someMethod(args) {!
body!
}!
}
new SomeInterface() {!
@Override!
public someType someMethod(args) {!
body!
}!
}
(args) -> {body}
new SomeInterface() {!
@Override!
public someType someMethod(args) {!
body!
}!
}
(args) -> {body}
e
d
a
m
r
o
f
:
o
a
m
m
u
u
s
r
e
a
i
R
!
c
!
!
n
a
a
t
m
s
i
n
in
ô
n
a
e
s
s
a
cl
INFERÊNCIA DE TIPOS
int
public int method(int x);
(x) -> x*10;
String
(x) -> x.length(); public int method(String x);
java.util.List<String>
void method(List<String> x,!
(x,y) -> x.add(y);
String
String y);
+ 1EXEMPLO…
List<String> anyStringList = new ArrayList<>();!
// ...!
anyStringList.sort( !
(a,b) -> Integer.compare(a.length(), b.length())!
);
METHOD REFERENCE
Class::staticMethod!
Class::method!
variable::method!
Class::new
LAMBDA & METHOD REFERENCE
p -> p.getName();
Person::getName;
x -> String.valueOf(x);
String::valueOf;
() -> new ArrayList();
ArrayList::new;
+METHOD REFERENCE
(Person p) -> { return p.getName();};
anyMethod ( p -> p.getName() );
anyMethod ( Person::getName );
N
EW
!!
!
+ MUDANÇAS NAS
INTERFACES
STATIC METHOD
public interface MyInterface {!
! public static void someMethod() {!
//do something...!
! }!
}
DEFAULT METHOD
public interface AnotherInterface {!
! public default int anotherMethod() {!
return 100;!
! }!
public int toDefineMethod();!
}
N
EW
!!
!
JAVA.UTIL.FUNCTIONS
N
EW
!!
!
JAVA.UTIL.FUNCTIONS
"Functional interfaces provide target types for lambda
expressions and method references.”
Javadoc
INTERFACES FUNCIONAIS…
1. Function<T, R> !
2. Predicate<T> !
3. Consumer<T> !
4. Supplier<T>!
5. BinaryOperator<T>
INTERFACES FUNCIONAIS…
1. Function<T, R> ! Representa uma “função”
2. Predicate<T> !
3. Consumer<T> !
4. Supplier<T>!
que recebe como
parâmetro um objeto do
tipo T e retorna um
objeto do tipo R.
5. BinaryOperator<T>
/**!
* Represents a function that accepts!
* one argument and produces a result.!
* …!
* @since 1.8!
*/!
@FunctionalInterface!
public interface Function<T, R> {!
!
/**!
* Applies this function to the!
* given argument.!
*!
* @param t the function argument!
* @return the function result!
*/!
R apply(T t);!
…!
}
java.util.stream
Interface Stream<T> (parte 1)
<R> Stream<R> map(Function<? super T,? extends R> mapper)
Returns a stream consisting of the results of applying the
given function to the elements of this stream.
<R> Stream<R> flapMap(Function<? super T,? extends Stream>
mapper)
Returns a stream consisting of the results of applying the
given function to the elements of this stream.
EXEMPLO FUNCTION
Function<Person, String> f1 = p -> p.getName();
Function<Person, String> f2 = Person::getName;
myStream.map( p -> p.getName() );
myStream.map( Person::getName );
INTERFACES FUNCIONAIS…
1. Function<T, R> ! Representa uma “predicado”
que
recebe
como
parâmetro
2. Predicate<T> !
um objeto do tipo T e retorna
3. Consumer<T> !
um objeto booleano.
4. Supplier<T>!
5. BinaryOperator<T>
INTERFACES FUNCIONAIS…
1. Function<T, R> !
2. Predicate<T> ! Representa uma “consumidor”
que
recebe
como
parâmetro
3. Consumer<T> !
um objeto do tipo T e não tem
4. Supplier<T>!
valor de retorno.
5. BinaryOperator<T>
INTERFACES FUNCIONAIS…
1. Function<T, R> !
2. Predicate<T> !
3. Consumer<T> ! Representa uma “produtor”
4. Supplier<T>!
que não tem parâmetro. e
retorna um objeto do tipo T.
5. BinaryOperator<T>
INTERFACES FUNCIONAIS…
1. Function<T, R> !
2. Predicate<T> !
Representa uma
“operador binário” que
3. Consumer<T> !
recebe dois parâmetros
do
tipo
T
e
retorna
um
4. Supplier<T>!
objeto também do tipo
5. BinaryOperator<T>
T.
java.util.stream
Interface Stream<T> (parte 2)
Stream<T>
filter(Predicate<? super T> predicate)
Returns a stream consisting of the elements of this stream
that match the given predicate.
void
forEach(Consumer<? super T> action)
Performs an action for each element of this stream.
Optional<T>
reduce(BinaryOperator<? super T> accumulator)
Performs a reduction on the elements of this stream, using
an associative accumulation function, and returns an
Optional describing the reduced value, if any.
static <T>
Stream<T>
generate(Supplier<? super T> s)
Returns an infinite sequential unordered stream where each
element is generated by the provided Supplier.
+ EXEMPLOS
myStream.filter( p -> p.isOld() );!
myStream.filter( Person::isOld );
+ DERIVADOS…
•
BiFunction<T,U,R> ! • IntFunction<R> !
•
BiPredicate<T,U> !
•
BIConsumer<T,U> ! • IntConsumer !
•
-!
•
•
-
•
•
•
LongFunction<R> !
•
LongPredicate !
•
LongConsumer !
IntSupplier!
•
LongSupplier!
IntBinaryOperator
•
LongBinaryOperator
IntPredicate !
+ Double, InToLong,…
+ JAVA.UTIL.FUNCTIONS
•
•
•
43 Interfaces funcionais…
functional method
largamente usada nas novas APIs (Stream, NIO, Collection, etc)
N
EW
!!
!
JAVA.UTIL.STREAM
API para operações sobre sequência (stream) de objetos
STREAM
•
Fornece uma API "fluente" (fluent-api) para
operação sobre um conjunto sequencial (stream)
de valores…
STREAM
•
Fornece uma API "fluente" (fluent-api) para
operação sobre um conjunto sequencial (stream)
de valores…
List<String> names = ..;!
Stream<String> stream = names.stream();
int sumChars = names.stream()!
.filter( n -> n.startsWith(“A") )!
.mapToInt( n -> n.length() )!
.sum();
STREAM
•
Fornece uma API "fluente" (fluent-api) para
operação sobre um conjunto sequencial (stream)
de valores…
List<String> names = ..;!
Stream<String> stream = names.stream();!
int sumChars = names.stream()!
.filter( n -> n.startsWith(“A") )!
.mapToInt( n -> n.length() )!
.sum();
int sumChars = names.stream()!
STREAM
.filter( n -> n.startsWith(“A") )!
•
Fornece uma API.mapToInt(
"fluente" (fluent-api)
para
n -> n.length()
)!
operação sobre .sum();
um conjunto sequencial (stream)
de valores…
int sumChars = names.stream()!
STREAM
Filtra os nomes que
.filter( n -> n.startsWith(“A") )!
começam com a letra
•
Fornece
uma
API
"fluente"
(fluent-api)
para
.mapToInt(
n
->
n.length()
)!
“A”, transforma a lista
de String
numa listasobre
de
operação
um
conjunto
sequencial
(stream)
.sum();
inteiros que representa
de valores…
a quantidade
de
caracteres para cada
nome filtrado, soma o
resultado e retorna.
int sumChars = names.stream()!
STREAM
Filtra os nomes que
.filter( n -> n.startsWith(“A") )!
começam com a letra
•
Fornece
uma
API
"fluente"
(fluent-api)
para
.mapToInt(
n
->
n.length()
)!
“A”, transforma a lista
de String
numa listasobre
de
operação
um
conjunto
sequencial
(stream)
.sum();
inteiros que representa
de valores…
a quantidade
de
caracteres para cada
nome filtrado, soma o
resultado e retorna.
names.stream()!
.distinct()!
.forEach(System.out::println);
int sumChars = names.stream()!
STREAM
Filtra os nomes que
.filter( n -> n.startsWith(“A") )!
começam com a letra
•
Fornece
uma
API
"fluente"
(fluent-api)
para
.mapToInt(
n
->
n.length()
)!
“A”, transforma a lista
de String
numa listasobre
de
operação
um
conjunto
sequencial
(stream)
.sum();
inteiros que representa
de valores…
a quantidade
de
caracteres para cada
nome filtrado, soma o
resultado e retorna.
names.stream()!
Remove os nomes
duplicados da lista e
.distinct()!
imprime o
resultado.
.forEach(System.out::println);
STREAM… PRINCIPAIS FEATURES…
map
Executa uma transformação 1-para-1 a
partir da Function informada
i
filter
Exclui os objetos que não atendem à
Predicate
i
forEach
Executa uma ação Consumer em cada
objeto do Stream
t
collect
“Coleta" os elementos do Stream em
outra estrutura (Collection, Map, String,
etc)
t
LAMBDA
STREAM
FUNCTION
collection.stream()!
.filter( n -> n.startsWith(“A") )!
.map( functionLambda )!
.peek( consumerLambda )!
.filter( predicateLambda )!
.flapMap( functionLambda )!
.sorted( comparatorLambda )!
.forEach( consumerLambda );
INTERMEDIATE X TERMINAL
•
Fluent-api… permite
sequenciamento de
operações… retorna
stream….
•
Operação final
•
Dispara a execução de
todas as operações
intermediárias (lazy)…
•
•
Mantém o stream
“aberto”,
•
Após ser invocado o
stream é fechado…
•
Lazy
•
•
filter, map, flatMap,
peek, distinct, sorted,
limit, skip…
forEach, toArray, reduce,
collect, min, max, sum,
count, anyMatch,
allMatch, noneMatch,
findFirts, findAny…
names.stream()!
! ! ! .forEach( … );
names.stream()!
.map( … )!
! ! ! .forEach( … );
names.stream()!
.map( … )!
.peek( … );!
! ! ! .forEach( … );
names.stream()!
.map( … )!
.peek( … );!
.flapMap( … )!
! ! ! .forEach( … );
names.stream()
.map( … )
.peek( … );
.flapMap( … )
.sorted( … );
.forEach( … );
names.stream()
.map( … )
.peek( … );
Intermediate
.flapMap( … )
.sorted( … );
.forEach( … );
Terminal
M
A
E
R
T
S
A
T
I
E
REC
:
s
e
t
n
e
i
d
Ingre
s
o
d
a
d
e
d
• 1 fonte
)
n
o
i
t
c
e
l
l
o
c
a
m
u
e
t
n
e
m
l
(norma
:
o
r
a
p
e
r
P
e
d
o
d
o
M
a
m
a
e
r
t
s
o
t
e
j
b
o
o
a
1. Obtenh
s
o
d
a
d
e
d
e
t
n
o
f
a
d
partir
!
s
i
a
m
u
o
a
m
u
e
u
q
i
l
2. Ap
s
a
i
r
á
i
d
e
m
r
e
t
n
i
s
e
operaçõ
!
o
ã
ç
a
r
e
p
o
a
m
u
e
u
q
3. Apli
.
l
a
n
i
m
r
te
SEQUENTIAL & PARALLEL
... = names.stream();!
... = names.parallelStream();
•
Sequential (default) x Parallel
•
ForkJoinPool.commonPool()
•
Stateless J x Stateful L
N
EW
JS
R
-3
10
JAVA.TIME
New Date & Time API
!!
!
NEW DATE & TIME API
1. Separação de Conceitos!!!!
2. Immutable !
3. +Fluent +Clean +Simple
NOVOS CONCEITOS
LocalTime
Hora, minuto e
segundo
10:15:30
LocalDate
Ano, mês e dia
2007-12-13
Ano, mês, dia, hora,
LocalDateTime
minuto e segundo
2007-12-03T10:15:30
YearMonth
Ano e mês
2007-12
MonthDay
Mês e dia
12-03
Instant
Representa um instante
no tempo!
(similar ao java.utilDate)
2014-09-14T
22:26:22.819Z
Duration
Quantidade de tempo
em horas
34.5 seconds
Period
Quantidade de tempo
em dias
2 years, 3 months
and 4 days
+ CONCEITOS
ZonedDateTime, OffsetDateTime, OffsetTime, ZoneOffset
FACTORY METHOD
!
Type.now();
Type.of(...);
!
FACTORY METHOD
... = LocalTime.now();
... = LocalTime.of(8,10);!
... = LocalDate.now();
... = LocalDate.of(2014,9,25);!
... = LocalDateTime.now();
... = LocalDateTime.of(2014,9,25,8,8);
+ FLUENT, +CLEAN, +SIMPLE
!
Type.plus(...);!
Type.minus(...);
Type.with(...);
IMMUTABLE!!!
+ FLUENT, +CLEAN, +SIMPLE
LocalTime time = now.plusHours(4)
.plusMinutes(30)
.plus(1, ChronoUnit.MINUTES)
.minusSeconds(100);!
!
ajuste = TemporalAdjusters.next(DayOfWeek.WEDNESDAY);
LocalDate nextWed = today.with(ajuste)
.withHour(3);
IMMUTABLE!!!
+ FLUENT, +CLEAN, +SIMPLE
LocalTime time = now.plusHours(4)
.plusMinutes(30)
.plus(1, ChronoUnit.MINUTES)
now não sofre .minusSeconds(100);!
alteração.
!
ajuste = TemporalAdjusters.next(DayOfWeek.WEDNESDAY);
LocalDate nextWed = today.with(ajuste)
.withHour(3);
today não sofre
alteração.
IMMUTABLE!!!
VEJA TAMBÉM…
•
Period & Duration!
•
DateTimeFormatter!
•
TemporalAdjuster
nextWed = LocalDate.now().with(
TemporalAdjusters.next(DayOfWeek.WEDNESDAY)
);
M
ud
na a
nç
A a
PI s
COLLECTIONS API
COLLECTIONS API
•
stream() e parallelStream()
•
vários métodos utilitários…
•
finalmente sort()!!!
•
lambda & functions
M
ud
na a
nç
A a
PI s
•
Iterable.forEach(Consumer)
•
Collection.removeIf(Predicate) • Map.remove(Object, Object)
•
Collection.spliterator()
•
Map.replace(K, V, V)
•
Collection.stream()
•
Map.computeIfAbsent(K, Func)
•
Collection.parallelStream()
•
Map.computeIfPresent(K, BiFunc)
•
List.sort(Comparator)
•
Map.compute(K, BiFunction)
•
List.replaceAll(UnaryOper)
•
Map.merge(K, V, BiFunction)
!
•
Map.getOrDefault(Object, V)
•
Map.putIfAbsent(K, V)
M
ud
na a
nç
A a
PI s
CONCURRENCY API
CONCURRENCY API (1)
1.ForkJoinPool.commonPool()
2.StampedLock - ReentrantReadWriteLock
3.+ java.util.concurrent.atomic.LongAdder
+ java.util.concurrent.atomic.LongAccumulator
+ java.util.concurrent.atomic.DoubleAdder
+ java.util.concurrent.atomic.DoubleAccumulator
CONCURRENCY API (2)
CompletableFuture
•
Future que pode ser “completado" .!
•
Fluent-API
•
Lambda!!!
CONCURRENCY API (2)
CompletableFuture
•
Future que pode ser “completado" .!
•
Fluent-API
•
Lambda!!!
CompletableFuture<String>
future;!
future = CompletableFuture.supplyAsync( lambdaSupplier )
.thenRun( lambdaConsumer )
.thenApply( lambdaFunction )
.thenApply(…)
…
.whenComplete( lambdaBiConsumer );!
CONCURRENCY API (2)
CompletableFuture<String> future;!
future = CompletableFuture.supplyAsync( lambdaSupplier )
.thenRun( lambdaConsumer )
.thenApply( lambdaFunction )
.thenApply(…)
…
•
.whenComplete( lambdaBiConsumer );!
CompletableFuture
Future que pode ser “completado" .!
Fluent-API
…
•
future.complete(“Default Value”); //COMPLETED!!!
…!
•
Lambda!!!
while(!future.isDone()) {
//...
}!
String result = future.get();!!
CONCURRENCY API (2)
CompletableFuture<String> future;!
future = CompletableFuture.supplyAsync( lambdaSupplier )
.thenRun( lambdaConsumer )
.thenApply( lambdaFunction )
.thenApply(…)
…
•
.whenComplete( lambdaBiConsumer );!
CompletableFuture
Future que pode ser “completado" .!
Fluent-API
…
•
future.complete(“Default Value”); //COMPLETED!!!
…!
•
Lambda!!!
while(!future.isDone()) {
//...
}!
String result = future.get();!!
M
ud
na a
nç
A a
PI s
IO/NIO API
IO/NIO API
•
basicamente métodos que tratam a
fonte de dados como Stream<?>…
M
ud
na a
nç
A a
PI s
IO/NIO API
basicamente métodos que tratam a
fonte de dados como Stream<?>…
•
M
ud
na a
nç
A a
PI s
•
BufferedReader.lines()
•
Files.walk(Path, ...)
•
Files.find(Path, BiPredicate,…)
•
Files.list(Path)
!
•
Files.lines(Path,…)
TYPE ANNOTATION
N
EW
JS
R
-3
08
•
!!
Checker Framework
http://types.cs.washington.edu/checker-framework/ !
•
Annotation em qualquer declaração de tipo !
•
ElementType.TYPE_PARAMETER,
ElementType.TYPE_USE
!
@NotNull String str1 = …!
@Email String str2 = …!
@NotNull @NotBlank String str3 = …!
!
class Folder<F extends @Existing File> { ... }!
List<@Immutable ? extends Comparable<T>> unchangeable = …!
!
new @NonEmpty @Readonly List<String>(myNonEmptyList)!
!
void method() throws @Critical AnyException { ... }
@NotNull String str1 = …!
@Email String str2 = …!
@NotNull @NotBlank String str3 = …!
ê
v
o
!
r
p
e
t
r
n
a
e
t
o
m
n
o
s
a
class Folder<F extends @Existing
File> { ...
}!
e
8
d
e
a
d
o
v
o
m
ã
Ja
s
i
ç
a
n
r
a
a
c
List<@Immutable ? extends Comparable<T>>
unchangeable
=
l
e
c
o m uer de
.
q
l
!
o
a
p
ti
qu
new @NonEmpty @Readonly List<String>(myNonEmptyList)!
!
void method() throws @Critical AnyException { ... }
…!
N
JE
EW
P-
17
4
!!
!
NASHORN!
RHYNO
Nashorn Javascript Engine
ADOPT A JSR
http://jcp.org
http://soujava.org.br/servicos/adopt-a-jsr/
JEP
JDK ENHANCEMENT-PROPOSAL
http://openjdk.java.net/jeps/0
[email protected]
?
OBRIGADO!!!
@utelemaco
[email protected]
OBRIGADO!!!
@utelemaco
[email protected]
Download