If we want to get two types of information from a Stream
of objects we can consume the Stream
twice and collect the results. But that is not very efficient, especially when the stream has a lot of objects. Since Java 12 we can use the teeing
method of the java.util.stream.Collectors
class to get multiple results while consuming the stream of objects only once. The teeing
method takes two collectors as argument each returning a separate result for the stream items. As third argument we must pass a function that will merge the results of the two collectors into a new object.
Continue reading →
In Java we can merge a key/value pair into a Map
with the merge
method. The first parameter is the key, the second the value and the third parameter of the merge
method is a remapping function that is applied when the key is already present in the Map
instance. The remapping function has the value of the key in the original Map
and the new value. We can define in the function what the resulting value should be. If we return null
the key is ignored.
Continue reading →
In Java we can use the iterate
method of the Stream
class to create an unbounded stream based on function invocations. We pass to the iterate
method an initial value and a function that can be applied to the value. The first element in the unbounded stream is the initial value, the next element is the result of the function invocation with as argument the value from the previous element and this continues for each new element. Suppose we have a function expressed as lambda expression i → i + 2
. When we use this lambda expression with the iterate
method and a initial value of 1
we get a stream of 1
, 1 → 1 + 2
, 3 → 3 + 2
, ….
Continue reading →
In Java we can use the generate
method of the Stream
class to create an infinite stream of values. The values are coming from a Supplier
instance we pass as argument to the generate
method. The Supplier
instance usually will be a lambda expression. To give back a fixed value we simply implement a Supplier
that returns the value. We can also have different values when we use a method that returns a different value on each invocation, for example the randomUUID
method of the UUID
class. When we use such a method we can create the Supplier
as method reference: UUID::randomUUID
.
Continue reading →