Java 8 Stream
概要
- Java 8 API 添加了一种新的抽象称为流Stream,Stream以一种声明的方式处理数据。
- Stream以一种类似SQL语句从数据库查询数据的直观方式在Java集合运算和表达的抽象中体现。
- Stream API 可以极大提高Java程序员的生产力并写出高效率、干净、简洁的代码。
- 将集合看作流,流通过管道传输并在节点上进行筛选、排序、聚合等处理。
- 管道处理分为中间操作处理(intermediate operation)和最终操作处理(terminal operation)。
什么是Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作。
注:
元素队列:特定类型对象并形成一个队列。
数据源:流的来源。可以是集合,数组,I/O channel,产生器generator等。
聚合操作:filter、map、reduce、find、match、sorted等中间操作。
Pipelining::中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格(fluent style)。这样做可以对操作进行优化,比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代:以前对集合遍历都是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。
生成流
使用Collection下的 stream() 和 parallelStream() 方法。
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
使用Arrays 中的 stream() 方法,将数组转成流。
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
使用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);
使用 BufferedReader.lines() 方法,将每行内容转成流。
BufferedReader reader = new BufferedReader(new FileReader("F:\\test_stream.txt"));
Stream<String> lineStream = reader.lines();
lineStream.forEach(System.out::println);
使用 Pattern.splitAsStream() 方法,将字符串分隔成流。
Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);
中间操作
forEach
Stream提供