Sie sind auf Seite 1von 4

Melhorias nas interfaces

Agora as interfaces podem definir mtodos static. Por exemplo, a classe java.util.
Comparator agora possui o mtodo static naturalOrder:
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
}
Agora as interfaces podem fornecer mtodos padres. Isso permite que o desenvolvedor
adicione novos mtodos sem quebrar os cdigos existentes que implementam a interfac
e. Por exemplo, o padro forEach foi includo na interface java.lang.Iterable:
public default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Vale ressaltar uma interface no pode fornecer uma implementao padro para os mtodos da
classe Object.

Interfaces funcionais
Uma interface funcional uma interface que define apenas um mtodo abstrato. A anot
ao FunctionalInterface foi adicionada para indicar que uma interface tem a inteno de
ser uma interface funcional. Por exemplo, a interface java.lang.Runnable uma in
terface funcional.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Note que o compilador do Java ir tratar qualquer interface que atenda definio de in
terface funcional mesmo que no possua a anotao FunctionalInterface. Porm quando anot
ada com FunctionalInterface o compilador verifica se h apenas um mtodo.

Lambdas
A caracterstica mais importante das interfaces funcionais que elas podem ser inst
anciadas por meio de lambdas. As expresses lambdas permitem tratar funcionalidade
s como argumento de mtodo, ou cdigo como dados. Abaixo esto alguns exemplos de lamb
das. As entradas esto esquerda e o cdigo direita. Os tipos de entrada podem ser in
feridos e so opcionais:
(int x, int y) -> { return x + y; }
(x, y) -> x + y
x -> x * x
() -> x
x -> { System.out.println(x); }
Aqui est um exemplo de instanciao da interface funcional Runnable:
Runnable r = () -> { System.out.println("Running!"); }

Referncias de mtodos
As referncias de mtodos so expresses lambdas compactas para mtodos que j possuem um no
me. Aqui esto alguns exemplos de referncias de mtodos, com o seu equivalente em exp
resso lambda direita:
String::valueOf x -> String.valueOf(x)
Object::toString x -> x.toString()
x::toString () -> x.toString()
ArrayList::new () -> new ArrayList<>()

Lambdas capturantes ou no capturantes


As lambdas so ditas como "capturantes" se acessarem uma varivel no static ou objeto
que estavam definidos fora do corpo da lambda. Por exemplo, a expresso lambda a
seguir est acessando uma varivel x:
int x = 5;
return y -> x + y;
Uma expresso lambda pode apenas acessar variveis locais e parmetros dentro de bloco
s que so final ou efetivamente final.

java.util.function
Um grande nmero de novas interfaces funcionais foi adicionado no pacote java.util
.function. A seguir temos alguns exemplos:
Function<T, R> - recebe T como entrada, retorna R como sada;
Predicate<T> - recebe T como entrada, retorna um valor booleano como sada;
Consumer<T> - recebe T como entrada, no retorna nada como sada;
Supplier<T> - no recebe entrada, retorna T como sada;
BinaryOperator<T> - recebe duas entradas T, retorna um T como sada.

java.util.stream
O novo pacote java.util.stream fornece classes para apoiar operaes no estilo funci
onal sobre os fluxos de dados. Uma maneira comum de obter um fluxo ser por meio d
e uma coleo (collection):
Stream<T> stream = collection.stream();
Aqui est um exemplo do pacote Javadocs:
int sumOfWeights = blocks.stream().filter(b -> b.getColor() == RED)
.mapToInt(b -> b.getWeight())
.sum();
Aqui usamos um bloco de Collection como fonte de fluxo, e ento otimizamos um filt
ro de reduo de mapa (filter-map-reduce) no fluxo para obter a soma dos pesos dos b
locos vermelhos.
Os fluxos podem ser infinitos e manter o estado (stateful), tambm podem ser seque
nciais ou em paralelo. Para se trabalhar com fluxos, primeiro deve-se obter um d
e alguma fonte, realizar uma ou mais operaes intermediarias, e ento executar uma op
erao terminal. As operaes intermediarias incluem filter, map, flatMap, peel, distinc
t, sorted, limit e substream.
As operaes terminais incluem forEach, toArray, reduce, collect, min, max, count, a
nyMatch, allMatch, noneMatch, findFirst e findAny. Uma classe muito til a java.ut
il.stream.Collectors que implementa vrias operaes de reduo, tal como converso de fluxo
s em colees e elementos de agregao.

Melhoras na inferncia dos tipos genricos


Isso melhora a habilidade do compilador Java para inferir tipos genricos e reduzi
r os argumentos de tipos informados nas chamadas dos mtodos genricos. No Java 7 o
cdigo parecido com o exemplo a seguir:
foo(Utility.<Type>bar());
Utility.<Type>foo().bar();
No Java 8, foi aprimorada a inferncia de argumentos e o encadeamento de chamadas
permite escrever um cdigo como este:
foo(Utility.bar());
Utility.foo().bar();

java.time
A nova API de data e hora est dentro do pacote java.time. Todas as classes so imutv
eis e thread-safe. Os tipos de data e hora inclusos so: Instant, LocalDate, Local
Time, LocalDateTime e ZonedDateTime. Alm das datas e horas, tambm existem os tipos
Duration e Period. Para completar tambm foram includos os tipos Month, DayOfWeek,
Year, Month, YearMonth, MonthDay, OffsetTime e OffsetDateTime. A maioria das no
vas classes de data e hora so suportadas pelo JDBC.

Complementando a API Collections


A habilidade das interfaces de terem mtodos padro permitiu que o Java 8 adicionass
e uma grande quantidade de mtodos novos na API Collections. As implementaes padres so
fornecidas em todas as interfaces e implementaes mais eficientes sero adicionadas s
classes completas quando apropriado. A seguir temos uma lista dos novos mtodos:
Iterable.forEach(Consumer)
Iterator.forEachRemaining(Consumer)
Collection.removeIf(Predicate)
Collection.spliterator()
Collection.stream()
Collection.parallelStream()
List.sort(Comparator)
List.replaceAll(UnaryOperator)
Map.forEach(BiConsumer)
Map.replaceAll(BiFunction)
Map.putIfAbsent(K, V)
Map.remove(Object, Object)
Map.replace(K, V, V)
Map.replace(K, V)
Map.computeIfAbsent(K, Function)
Map.computeIfPresent(K, BiFunction)
Map.compute(K, BiFunction)
Map.merge(K, V, BiFunction)
Map.getOrDefault(Object, V)

Complementando a API Concurrency


Houve algumas adies na API Concurrency, algumas das quais sero discutidas brevement
e aqui. O ForkJoinPool.commonPool() uma estrutura que trata as operaes de fluxo em
paralelo. A fila comum utilizada por qualquer ForkJoinTask que no apresentar exp
licitamente uma fila especifica. A ConcurrentHashMap est sendo reescrita compleme
nte. A StampedLock a nova implementao de bloqueio que pode ser utilizada como uma
alternativa para o ReentrantReadWriteLock. A CompletableFuture uma implementao da
interface Future que fornece mtodos para executar e encadear tarefas assncronas.

Complementando a API IO/NIO


H novos mtodos de IO/NIO, que so utilizados para obter um java.util.stream.Stream d
e arquivos ou fluxos de entrada:
BufferedReader.lines()
Files.list(Path)
Files.walk(Path, int, FileVisitOption...)
Files.walk(Path, FileVisitOption...)
Files.find(Path, int, BiPredicate, FileVisitOption...)
Files.lines(Path, Charset)
DirectoryStream.stream()
H uma nova UncheckedIOException, que uma IOException que estende a RuntimeExcepti
on. H tambm o CloseableStream, um stream que pode e deve ser fechado.

Mudanas no Reflection e nas anotaes


Com os anotaes de tipos, as anotaes podero ser escritas em mais locais, como um argum
ento de tipos genricos como List<@Nullable String>. Isso aprimora a deteco de erros
pelas ferramentas de anlise estticas o que fortalecer e refinar o sistema de tipos
embarcados no Java.

Nashorn: mecanismo de JavaScript


O Nashorn a implementao mais nova, leve e de alto desempenho de JavaScript integra
do no JDK. O Nashorn o sucessor do Rhino com desempenho aprimorado e melhor uso
de memria. Ele contar com a API javax.script, mas no incluir o suporte a DOM/CSS e t
ambm no incluir API de plugins para navegadores.

Outros complementos adicionados no java.lang, java.util e em outros locais.


H outros complementos adicionados em outros pacotes que no foram mencionados. Aqui
esto alguns dos mais notveis: A ThreadLocal.withInitial(Supplier) permite a decla
rao de uma varivel thread-local mais compacta. As muito atrasadas StringJoiner e St
ring.join(...) so finalmente parte do Java 8. O Comparator oferece alguns mtodos n
ovos para executar o encadeamento e comparao baseada em campos (atributos). O tama
nho do pool padro do mapa de String est maior, por volta de 25 a 50K.

Das könnte Ihnen auch gefallen