Professional Documents
Culture Documents
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<>()
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.
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.