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]