1.大致分类
本文将主要从如下五个方面来讲Stream流的创建
2.直接上代码
为了大家的方便,也是为了自己以后看起来方便,我对上面五种创建Stream流的方式都手写了一下,下面是具体的代码
package com.nrsc.stream;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Stream流的创建
*/
public class create {
public static void main(String[] args) {
/**
* Ⅰ 从集合创建流
* 继承了Collection接口的集合类可以使用下面两种方式来创建Stream流
* 方式1:集合实体.stream-----------------创建普通Stream流
* 方式2:集合实体.parallelStream---------创建并行流
*
* 下面以List为例进行演示
*/
List<String> list = Arrays.asList("hello", "world", "hi", "java"); //创建list集合
list.stream().forEach(s -> System.out.print(s + " "));// -----------------创建普通Stream流
list.parallelStream().forEach(s -> System.out.print("|||" + s));//---------创建并行流
System.out.println("==========================");
/**
* Ⅱ 从数组创建流 --- Arrays.
* 主要包含两种方式
* 方式1:Arrays.stream(T[] array)-------------------------------------------参数为一个数组
* 方式2:Arrays.stream(T[] array, int startInclusive, int endExclusive)-----参数为一个数组,加上起始下标(包头不包尾)
*/
Arrays.stream(new String[]{"hello", "world", "hi", "java"}).forEach(System.out::println);
Arrays.stream(new int[]{1111, 1, 22, 33, 4, 5, 6}, 2, 5).forEach(System.out::println); //22,33,4
Arrays.stream(new String[]{"hello", "world", "hi", "java", "python"}, 1, 3).forEach(System.out::println); //world hi
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++");
/**
* Ⅲ 数字流-------IntStream/LongStream/DoubleStream/
* 以IntStream为例:
*/
IntStream.empty(); //产生一个空的IntStream流
IntStream.of(1, 2, 3, 4).forEach(System.out::println);
IntStream.of(new int[]{11, 22, 33, 44}).forEach(System.out::println);
IntStream.iterate(1, i -> i + 2).limit(5).forEach(System.out::println); //1 3 5 7 9 (其中第一个参数1为基数,第二个参数要一个输入和输出都为int型的一元函数)
IntStream.generate(() -> 3333).limit(5).forEach(System.out::println); //参数为一个提供者
IntStream.range(1, 10).forEach(System.out::println); /**1-9,如果第一个参数大于第二个参数返回一个空的IntStream流*/
IntStream.rangeClosed(1, 10).forEach(System.out::println); /**1-10,如果第一个参数大于第二个参数返回一个空的IntStream流*/
IntStream.concat(IntStream.of(1, 2, 3), IntStream.of(11, 22, 33)).forEach(System.out::println); //合并两个IntStream流
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
/**
* Ⅳ 用Stream类进行创建
* 注意1: Stream类创建流与 方式Ⅲ创建流的方式很想只是少了range 和 rangeClosed方法
* 注意2: Stream和IntStream/LongStream/DoubleStream/并没有继承关系,
* 由IntStream/LongStream/DoubleStream变为Stream流要进行装箱操作----boxed
*/
Stream.empty();//产生一个空的Stream流
Stream.of("hello", "world", "hi", "java").forEach(System.out::println);
Stream.of(new String[]{"hello2", "world2", "hi2", "java2"}).forEach(System.out::println);
Stream.iterate("say", s -> s + " hi").limit(3).forEach(System.out::println); //say say hi say hi hi
Stream.generate(Math::random).limit(5).forEach(System.out::println); //产生5个double随机数
Stream.concat(Stream.of(11, 22, 33), Stream.of(44, 55, 66)).forEach(System.out::println); //合并数组
/**
* 这里需要注意Stream和IntStream并没有继承关系,InStream转为Stream要进行装箱操作 boxed
*/
Stream.concat(IntStream.of(99, 88, 77).boxed(), Stream.of(-11, -22, -33)).forEach(System.out::println);
//同时要注意下面种方式是无法完成转换的
//IntStream intStream = (IntStream) Stream.of(1, 2, 3); //会报错
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
/**
* Ⅴ 其他方式
* 由字符串.chars创建流
* 由 new Random().ints new Random().longs new Random().doubles
*
* 以new Random().ints 为例
*/
/**由字符串直接获得一个流对象*/
"abc".chars().forEach(System.out::println);//97 98 99 //流中是各个字符对应的ASCII码值
"abc".chars().forEach(i -> System.out.println((char) i)); //a b c
System.out.println("#########################################################");
/**
* 通过 new Random().ints/ new Random().longs()/ new Random().doubles()方式创建
*/
new Random().ints().limit(5).forEach(System.out::println); //产生5个随机数//通过limit限制流产生的个数
new Random().ints(4).forEach(System.out::println); //产生4个随机数//在ints()里显示流产生的个数
System.out.println("#########################################################");
new Random().ints(2, 7).limit(5).forEach(System.out::println); //随机产生5个在2-7之间的数字(包头不包尾)
new Random().ints(5, 1, 10).forEach(System.out::println); //随机产生5个大小在1-10之间的数(包头不包尾)
}
}
3.一点说明
对是方式Ⅰ着重说明一下,这里的集合指的是继承了Collection接口的集合,下面这个继承关系(图片来自于Java集合框架综述,大家应该都挺熟悉了,它们都可以按照方式1进行Stream流的创建.