引言:
Stream定义:
A sequence of elements from source that supports aggregate operations.
sequence of elements:一个流对外提供一个接口,可以访问到一串特定的数据。流不存储元素,但是可以根据需要进行计算转化
source:数据来源,如数据结构,数组,文件等
aggregate operation:聚合操作,流支持像SQL操作或者其他函数式语言的操作,如filter、map、reduce、find、match、sorted等
Stream流特点:
pipelining:很多流操作也是返回一个流,如.filter()
Internal Iteration:流操作进行迭代,用户感知不到循环遍历。
流的工作流程:
流的创建
流的转换:将流转换为其他流的中间操作,可包括多个步骤(惰性操作)
流的计算结果:该操作会强制执行之前的惰性操作,也就是说只有第三步启动,才会执行第二部的惰性操作,此步骤之后,流就不可用了
一切流操作都逃不出流的三大工作流程!一个流只能被使用一次
一、stream流的创建——产生一个流对象
1.Collection接口的stream方法
Stream<String> as = new ArrayList<String>().stream();
Stream<String> hs = new HashSet<String>().stream();
//还有LinkedList,linkedSet,TreeSet,Vector等等
2.Arrays.stream可以将数组转化为Stream
Stream<String> stream = Arrays.stream("a,b,c,d,e".split(","), 3, 5);
//数组第3到第五个元素放到流中去
3.利用Stream类进行转化
//of方法,直接将数组转化
Stream<Integer> c1 = Stream.of(new Integer[5]);
Stream<String> c2 = Stream.of("a,b,c".split(","));
Stream<String> c3 = Stream.of("a", "b", "c");
//产生一个空流
Stream<Object> d1 = Stream.empty();
//generate方法,接收一个lambda表达式
Stream<String> e1 = Stream.generate(() -> "hello");
Stream<Double> e2 = Stream.generate(Math::random);
//iterate方法,接受一个种子,和一个lambda表达式
Stream<BigInteger> iterate = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
4.基本类型流
IntStream、LongStream、DoubleStream(只有这三种)
IntStream s1 = IntStream.of(1, 2, 3, 4, 5);
s1 = Arrays.stream(new int[]{1,2,3});
s1 = IntStream.generate(() -> (int) (Math.random() * 100));
s1=IntStream.range(1,5);//1,2,3,4
s1=IntStream.rangeClosed(1,5);//1,2,3,4,5
IntStream s2 = IntStream.of(1, 2, 3, 4, 5);
Stream<Integer> s3 = s2.boxed();//转换为对象流
IntStream s4 = s3.mapToInt(Integer::intValue);//转换为IntStream