本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Stream API
概述
- JDK 8 有两个重大的改变。第一个是 Lambda 表达式,另外一个是 Stream API 。
- Stream API (java.util.stream) 将真正的函数式编程风格引入到 Java 中。这是目前为止对 Java 类库最好的补充,因为 Stream API 可以极大的提高 Java 程序员的生产力,让程序员写出高效、干净、简洁的代码。
- Stream 是 JDK 8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,当然,也可以使用 Stream API 来并行执行操作。换言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
- Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,负责存储数据,Stream 流讲的是计算,负责处理数据!”。
注意:
- ① Stream 自己不会存储元素。
- ② Stream 不会改变源对象,每次处理读会返回一个持有结果的新的 Stream 。
- ③ Stream 操作是延迟执行的,意味着会等到需要结果的时候才执行。
Stream 流的操作步骤
- ① 创建 Stream :通过一个数据源(如:集合、数组),获取一个流。
- ② 中间操作:中间操作是个操作链,对数据源的数据进行 n 次处理,但是在终结操作前,并不会真正的执行。
- ③ 终止操作:一旦执行终止操作,就执行中间操作链,最终产生结果并结束 Stream 。
创建 Stream
通过集合创建 Stream
- JDK 8 中的 Collection 接口新增了两个获取流的方法:
- 获取一个顺序流: default Stream stream() {}
- 获取一个并行流:default Stream parallelStream() {}
示例:
package com.github.stream.demo1;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// 获取顺序流
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println);
}
}
通过数组创建 Stream
- JDK 8 中的 Arrays 新增了静态方法,用来获取 Stream 流: public static Stream stream(T[] array) {}
- 重载形式,能够处理对应基本类型的数组:
- 获取一个整型数据流: public static IntStream stream(int[] array) {}
- 获取一个长整型数据流: public static LongStream stream(long[] array) {}
- 获取一个浮点型数据流: public static DoubleStream stream(double[] array) {} 示例:
package com.github.stream.demo2;
import java.util.Arrays;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
String[] arr = {"PHP", "is", "the", "best", "language", "in", "the", "world"};
Stream<String> stream = Arrays.stream(arr);
stream.forEach(System.out::println);
}
}