Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

1.13 基本类型流

到目前为止,我们都是将整数收集到Stream<Integer>中,尽管很明显,将每个整数都包装到包装器对象中是很低效的。对其他基本类型来说,情况也是一样,这些基本类型是:double、float、long、short、char、byte和boolean。流库中具有专门的类型IntStream、LongStream和DoubleStream,用来直接存储基本类型值,而无需使用包装器。如果想要存储short、char、byte和boolean,可以使用IntStream,而对于float,可以使用DoubleStream。

为了创建IntStream,需要调用IntStream.of和Arrays.stream方法:

与对象流一样,我们还可以使用静态的generate和iterate方法。此外,IntStream和LongStream有静态方法range和rangeClosed,可以生成步长为1的整数范围:

CharSequence接口拥有codePoints和chars方法,可以生成由字符的Unicode码或由UTF-16编码机制的码元构成的IntStream。(请参见第2章以了解其复杂的细节。)

当你有一个对象流时,可以用mapToInt、mapToLong和mapToDouble将其转换为基本类型流。例如,如果你有一个字符串流,并想将其长度处理为整数,那么就可以在IntStream中实现此目的:

为了将基本类型流转换为对象流,需要使用boxed方法:

通常,基本类型流上的方法与对象流上的方法类似。下面是最主要的差异:

·toArray方法会返回基本类型数组。

·产生可选结果的方法会返回一个OptionalInt、OptionalLong或OptionalDouble。这些类与Optional类类似,但是具有getAsInt、getAsLong和getAsDouble方法,而不是get方法。

·具有返回总和、平均值、最大值和最小值的sum、average、max和min方法。对象流没有定义这些方法。

·summaryStatistics方法会产生一个类型为IntSummaryStatistics、LongSummary-Statistics或DoubleSummaryStatistics的对象,它们可以同时报告流的总和、平均值、最大值和最小值。

注意:Random类具有ints、longs和doubles方法,它们会返回由随机数构成的基本类型流。

程序清单1-7给出了基本类型流的API的示例。

程序清单1-7 streams/PrimitiveTypeStreams.java

java.util.stream.IntStream 8

·static IntStream range(int startInclusive,int endExclusive)

·static IntStream rangeClosed(int startInclusive,int endInclusive)

产生一个由给定范围内的整数构成的IntStream。

·static IntStream of(int...values)

产生一个由给定元素构成的IntStream。

·int[]toArray()

产生一个由当前流中的元素构成的数组。

·int sum()

·OptionalDouble average()

·OptionalInt max()

·OptionalInt min()

·IntSummaryStatistics summaryStatistics()

产生当前流中元素的总和、平均值、最大值和最小值,或者从中可以获得这些结果的所有四种值的对象。

·Stream<Integer>boxed()

产生用于当前流中的元素的包装器对象流。

java.util.stream.LongStream 8

·static LongStream range(long startInclusive,long endExclusive)

·static LongStream rangeClosed(long startInclusive,long endInclusive)

用给定范围内的整数产生一个LongStream。

·static LongStream of(long...values)

用给定元素产生一个LongStream。

·long[]toArray()

用当前流中的元素产生一个数组。

·long sum()

·OptionalDouble average()

·OptionalLong max()

·OptionalLong min()

·LongSummaryStatistics summaryStatistics()

产生当前流中元素的总和、平均值、最大值和最小值,或者从中可以获得这些结果的所有四种值的对象。

·Streamboxed()

产生用于当前流中的元素的包装器对象流。

java.util.stream.DoubleStream 8

·static DoubleStream of(double...values)

用给定元素产生一个DoubleStream。

·double[]toArray()

用当前流中的元素产生一个数组。

·double sum()

·OptionalDouble average()

·OptionalDouble max()

·OptionalDouble min()

·DoubleSummaryStatistics summaryStatistics()

产生当前流中元素的总和、平均值、最大值和最小值,或者从中可以获得这些结果的所有四种值的对象。

·Stream<Double>boxed()

产生用于当前流中的元素的包装器对象流。

java.lang.CharSequence 1.0

·IntStream codePoints()8

产生由当前字符串的所有Unicode码点构成的流。

java.util.Random 1.0

·IntStream ints()

·IntStream ints(int randomNumberOrigin,int randomNumberBound)8

·IntStream ints(long streamSize)8

·IntStream ints(long streamSize,int randomNumberOrigin,int randomNumberBound)8

·LongStream longs()8

·LongStream longs(long randomNumberOrigin,long randomNumberBound)8

·LongStream longs(long streamSize)8

·LongStream longs(long streamSize,long randomNumberOrigin,long randomNumberBound)8

·DoubleStream doubles()8

·DoubleStream doubles(double randomNumberOrigin,double randomNumberBound)8

·DoubleStream doubles(long streamSize)8

·DoubleStream doubles(long streamSize,double randomNumberOrigin,double randomNumberBound)8

产生随机数流。如果提供了streamSize,这个流就是具有给定数量元素的有限流。当提供了边界时,其元素将位于randomNumberOrigin(包含)和randomNumberBound(不包含)的区间内。

java.util.Optional(Int|Long|Double)8

·static Optional(Int|Long|Double)of((int|long|double)value)

用所提供的基本类型值产生一个可选对象。

·(int|long|double)getAs(Int|Long|Double)()

产生当前可选对象的值,或者在其为空时抛出一个NoSuchElementException异常。

·(int|long|double)orElse((int|long|double)other)

·(int|long|double)orElseGet((Int|Long|Double)Supplier other)

产生当前可选对象的值,或者在这个对象为空时产生可替代的值。

·void ifPresent((Int|Long|Double)Consumer consumer)

如果当前可选对象不为空,则将其值传递给consumer。

java.util.(Int|Long|Double)SummaryStatistics 8

·long getCount()

·(int|long|double)getSum()

·double getAverage()

·(int|long|double)getMax()

·(int|long|double)getMin()

产生收集到的元素的个数、总和、平均值、最大值和最小值。