Transforming Data with Java 8 Streams API: Difference between revisions
Line 25: | Line 25: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The above call performs [[Java_Autoboxing#Autoboxing_and_Streams_API|autoboxing]] when the result of the lambda expression is a primitive type. In these cases, it is advisable to use a specialized mapping function, to avoid unnecessary [[Java_Autoboxing#Autoboxing_and_Streams_API|autoboxing]]: | |||
<syntaxhighlight lang='java'> | <syntaxhighlight lang='java'> |
Revision as of 18:25, 28 March 2018
Internal
Overview
The Stream API offers the possibility to intercept a stream and converts its elements into elements of another type, offered also as a stream. This operations is conventionally named mapping. The world mapping is used because it has a meaning similar to transforming, but with the nuance of "creating a new version" rather than "modifying".
Mapping Data
The Stream API exposes the map() method, which converts the stream's elements into elements of another type, offered also as a stream. The conversion if performed by a Function<T, R> presented as the argument of the map() method.
public interface Stream<T> {
...
<R> Stream<R> map(Function<? super T, ? extends R> mappingFunction);
...
}
The above call performs autoboxing when the result of the lambda expression is a primitive type. In these cases, it is advisable to use a specialized mapping function, to avoid unnecessary autoboxing:
public interface Stream<T> {
...
IntStream mapToInt(ToIntFunction<? super T> mapper);
LongStream mapToLong(ToLongFunction<? super T> mapper);
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);
...
}
Flat-Mapping Data
flatMap()
flatMap() returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element. Each mapped stream is closed after its contents have been placed into this stream. If a mapped stream is null an empty stream is used, instead.
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
Example:
List<String> uniqueChars = words.
stream().
map(word -> word.split("")).
flatMap(Arrays::stream).
distinct().
collect(toList());