Java Reference
In-Depth Information
This has the effect of splitting up each quote into its component words, and making
one superstream out of them. We count the words by creating the object
words
,
essentially “pausing” halfway through the stream pipeline, and rematerializing into a
collection to get the number of words before resuming our stream operations.
Once we've done that, we can proceed with the reduce, and add up the length of all
the words, before dividing by the number of words that we have, across the quotes.
Remember that streams are a lazy abstraction, so to perform an eager operation
(like getting the size of a collection that backs a stream) we have to rematerialize the
collection.
Streams utility default methods
Java 8 takes the opportunity to introduce a number of new methods to the Java Col‐
lections libraries. Now that the language supports default methods, it is possible to
add new methods to the Collections without breaking backward compatibility.
Some of these methods are “scaffolding methods” for the Streams abstraction. These
include methods such as
Collection::stream
,
Collection::parallelStream
, and
Collection::spliterator
(which has specialized forms
List::spliterator
and
Set::spliterator
).
Others are “missing methods,” such as
Map::remove
and
Map::replace
. This also
includes the
List::sort
method, that is defined in
List
like this:
// Essentially just forwards to the helper method in Collections
public
default
void
sort
(
Comparator
<?
super
E
>
c
)
{
Collections
.<
E
>
sort
(
this
,
c
);
}
Also in the missing methods is
Map::putIfAbsent
, which has been adopted from
the
ConcurrentMap
interface in
java.util.concurrent
.
Another missing method worth noting is
Map::getOrDefault
, which allows the
programmer to avoid a lot of tedious
null
checks, by providing a value that should
be returned if the key is not found.
The remaining methods provide additional functional techniques using the inter‐
faces of
java.util.function
:
Collection::removeIf
This method takes a
Predicate
and iterates internally over the collection,
removing any elements that satisfy the predicate object.
s
a
Map::forEach
The single argument to this method is a lambda expression that takes two argu‐
ments (one of the key's type and one of the value's type) and returns
void
. This
is converted to an instance of
BiConsumer
and is applied to each key-value pair
in the map.