1.13 基本流类型
将每个整数都包装到包装器对象中是很低效的(jdk提供包装类以及自动装箱和拆箱只是为了面向对象编程,我们不应该滥用)。对于一些基本类型:double、float、long、short、char、byte、和boolean,流库中有直接存储基本类型值的类型IntStream、LongStream和DoubleStream。若果想要存储short、char、byte、和boolean,可以使用IntStream,对于float,可以使用DoubleStream。
为了创建IntStream,需要调用IntStream.of和Arrays.stream方法:
IntStream stream = IntStream.of(1,1,2,3,5);
int[] array = {1,1,2,3,5};
stream = Arrays.stream(array,1,3);//value, from, to 1,2
与对象流一样,我们还可以使用静态的generate和iterate方法。此外,IntStream和LongsSream有静态方法range和rangeClosed,可以生成步长为1的整数范围:
IntStream is2 = IntStream.range(5, 10);//5,6,7,8,9
IntStream is3 = IntStream.rangeClosed(5, 10);//5,6,7,8,9,10
CharSequence接口具有codePoints和chars方法,可以生成由字符的Unicode码或又UTF-16编码机制的码元构成的IntStream。(详情参见第二章输入与输出)
String sentence = "\uD835\uDD46 is the set of octonions.";
IntStream codes = sentence.codePoints();
System.out.println(codes.mapToObj(
c->String.format("%X", c)).collect(Collectors.joining()));
当有一个对象流时,可以用mapToInt、mapToLong和mapToDouble将其转换为基本类型流。
Stream<String> words = Stream.of(contents.split(" "));
IntStream is4 = words.mapToInt(String::length);
问了将基本类型流转换位对象流,需要使用boxed方法:
Stream<Integer> integers = IntStream.range(0, 100).boxed();
通常,基本类型流上的方法与对象流上的方法类似。 下面是主要差异:
- toArray方法会返回基本类型数组。
- 产生可选结果的方法会返回一个OptionalInt、OptionalLong、OptionalDouble、这些类与Optional类类似,但是具有getAsInt、getAsLong和getAsDouble方法,而不是get方法。
- 具有返回总和、平均值、最大值和最小值的sum、average、max和min方法。对象流没有定义这些方法。
- summaryStatistics方法会产生一个类型为IntSummaryStatistics、LongSummaryStatistics或DoubleSummaryStatistics的对象,他们可以同时报告流的总和,平均值、最大值和最小值。
注意Random类具有ints、longs和doubles方法,他们会返回有随机数构成的基本类型流。
package JavaSE8的流库;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.*;
public class PrimitiveTypeStreams {
public static void show(String title , IntStream stream)
{
final int SIZE = 10;
int[] firstElements = stream.limit(SIZE+1).toArray();
System.out.println(title+":");
for(int i = 0;i<firstElements.length;i++)
{
if(i>0)System.out.print(",");
if(i<SIZE)System.out.print(firstElements[i]);
else System.out.print("...");
}
System.out.println();
}
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
IntStream is1 = IntStream.generate(
()->(int)(Math.random()*100));
show("is1",is1);
IntStream is2 = IntStream.range(5, 10);
show("is2",is2);
IntStream is3 = IntStream.rangeClosed(5, 10);
show("is3",is3);
Path path = Paths.get("alice30.txt");
String contents = new String(
Files.readAllBytes(path),StandardCharsets.UTF_8);
Stream<String> words = Stream.of(contents.split(" "));
IntStream is4 = words.mapToInt(String::length);
show("is4",is4);
String sentence = "\uD835\uDD46 is the set of octonions.";
System.out.println(sentence);
IntStream codes = sentence.codePoints();
System.out.println(codes.mapToObj(
c->String.format("%X", c)).collect(Collectors.joining()));
Stream<Integer> integers = IntStream.range(0, 100).boxed();
IntStream is5 = integers.mapToInt(Integer::intValue);
show("is5",is5);
IntStream stream = IntStream.of(1,1,2,3,5);
show("stream",stream);
int[] array = {1,1,2,3,5};
stream = Arrays.stream(array,1,3);//value, from, to 1,2
show("stream",stream);
}
}
运行结果:
如有问题,请评论处指正,Thanks♪(・ω・)ノ