Stream概要

  • stream是用于对集合迭代器的增强,使之完成能够完成更高效的聚合操作(过滤、排序、统计分组)或者大批量数据操作。此外stream与lambda表达式结合后编码效率大大提高,并且可读性更强。


创建流的5种方式


//        从集合获取
List<String> detail = new ArrayList<String>(){{addAll(Arrays.asList("12","21"));}};
final Stream<String> stream = detail.stream();
// Arrays转换获得
final Stream<Integer> stream1 = Arrays.stream(new Integer[]{1, 2, 3, 4, 5});
// 从Stream直接生成流
final Stream<String> stringStream = Stream.of("1", "2");
// 根据公式生成无限流
final Stream<Integer> formula = Stream.iterate(0,(x1) -> x1 + 2);
// 生成无限随机数流
final Stream<Double> randoms = Stream.generate(()-> Math.random());

特点:

1 . 不是数据结构,不会保存数据。

  1. 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可以修改流中元素)
  2. 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。

二、分类

Stream Api (Java)_静态方法

无状态:指元素的处理不受之前元素的影响;

有状态:指该操作只有拿到所有元素之后才能继续下去。

非短路操作:指必须处理所有元素才能得到最终结果;

短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。

三、具体用法

  1. 流的常用创建方法

1.1 使用Collection下的 stream() 和 parallelStream() 方法

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

1.2 使用Arrays 中的 stream() 方法,将数组转成流

Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

1.3 使用Stream中的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10

Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);

1.4 使用 BufferedReader.lines() 方法,将每行内容转成流

BufferedReader reader = new BufferedReader(new FileReader("F:\\\\test_stream.txt"));
Stream<String> lineStream = reader.lines();
lineStream.forEach(System.out::println);

1.5 使用 Pattern.splitAsStream() 方法,将字符串分隔成流

Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);