So far, we have collected integers in a Stream<Integer>, even though it is clearly inefficient to wrap each integer into a wrapper object. The same is true for the other primitive types—double, float, long, short, char, byte, and boolean. The stream library has specialized types IntStream, LongStream, and DoubleStream that store primitive values directly, without using wrappers. If you want to store short, char, byte, and boolean, use an IntStream; for float, use a DoubleStream.
To create an IntStream, call the IntStream.of and Arrays.stream methods:
IntStream stream = IntStream.of(1, 1, 2, 3, 5);
stream = Arrays.stream(values, from, to); // values is an int array
As with object streams, you can also use the static generate and iterate methods. In addition, IntStream and LongStream have static methods range and rangeClosed that generate integer ranges with step size one:
IntStream zeroToNinetyNine = IntStream.range(0, 100); // Upper bound is excluded
IntStream zeroToHundred = IntStream.rangeClosed(0, 100); // Upper bound is included
The CharSequence interface has methods codePoints and chars that yield an IntStream of the Unicode codes of the characters or of the code units in the UTF-16 encoding. (See Chapter 1 for the sordid details.)
String sentence = “\uD835\uDD46 is the set of octonions.”;
// \uD835\uDD46 is the UTF-16 encoding of the letter 1 , unicode U+1D546
IntStream codes = sentence.codePoints();
// The stream with hex values 1D546 20 69 73 20 . . .
When you have a stream of objects, you can transform it to a primitive type stream with the mapToInt, mapToLong, or mapToDoubte methods. For example, if you have a stream of strings and want to process their lengths as integers, you might as well do it in an IntStream:
Stream<String> words = …;
IntStream lengths = words.mapToInt(String::tength);
To convert a primitive type stream to an object stream, use the boxed method:
Stream<Integer> integers = IntStream.range(0, 100).boxed();
Generally, the methods on primitive type streams are analogous to those on object streams. Here are the most notable differences:
- The toArray methods return primitive type arrays.
- Methods that yield an optional result return an OptionalInt, OptionalLong, or OptionalDouble. These classes are analogous to the Optional class, but they have methods getAsInt, getAsLong, and getAsDouble instead of the get method.
- There are methods sum, average, max, and min that return the sum, average, maximum, and minimum. These methods are not defined for object streams.
- The summaryStatistics method yields an object of type IntSummaryStatistics, LongSummaryStatistics, or DoubleSummaryStatistics that can simultaneously report the sum, count, average, maximum, and minimum of the stream.
The program in Listing 1.7 gives examples for the API of primitive type streams.
Source: Horstmann Cay S. (2019), Core Java. Volume II – Advanced Features, Pearson; 11th edition.