JAVA SE 8 的流库-1.13基本类型流

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♪(・ω・)ノ

猜你喜欢

转载自blog.csdn.net/z036548/article/details/84197740