概念
Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。
通常我们需要多行代码才能完成的操作,借助于Stream流式处理可以很简单的实现。
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。
同时Stream提供串行和并行两种模式进行汇聚操作。比如你的Stream里面有很多数据,Stream可以开多个线程每个线程处理一部分。
最后把结果汇总起来。
在开始之前我们先用一个图来整体的概况下Stream。如下所示:
创建
1.集合作为Stream数据源
stream()方法
@Test
public void collectionStream() {
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
// 使用List创建一个流对象
Stream<Integer> stream = list.stream();
// TODO: 对流对象做处理
}
parallelStream()方法
@Test
public void collectionParallelStream() {
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
// 使用List创建一个流对象
Stream<Integer> stream = list.parallelStream();
// TODO: 对流对象做处理
}
2. 数组作为Stream数据源
@Test
public void arrayStream() {
int[] intArray = new int[10];
for (int index = 0; index < intArray.length; index++) {
intArray[index] = index;
}
// 使用数组创建一个流对象
IntStream stream = Arrays.stream(intArray);
// TODO: 对流对象做处理
}
3.BufferedReader作为Stream数据源
@Test
public void bufferedReaderStream() {
File file = new File("/home/tuacy/github/google-guava-study/src/main/resources/application.yml");
try {
// 把文件里面的内容一行一行的读出来
BufferedReader in = new BufferedReader(new FileReader(file));
// 生成一个Stream对象
Stream<String> stream = in.lines();
// TODO: 对流对象做处理
} catch (IOException e) {
e.printStackTrace();
}
}
4.File作为Stream数据源
Files.list()
列出指定Path下面的所有文件。把这些文件作为Stream数据源。
Files.walk()
Files.walk()方法用于遍历子文件(包括文件夹)。参数maxDepth用于指定遍历的深度。把子文件(子文件夹)作为Stream数据源。
Files.find()
Files.find方法用于遍历查找(过滤)子文件。参数里面会指定查询(过滤)条件。把过滤出来的子文件作为Stream的数据源。
Files.lines()
Files.lines方法是把指定Path文件里面的每一行内容作为Stream的数据源。
自己构建Stream
Stream.of()
Stream<Integer> ofSteam = Stream.of(1,2,3,4,5,6);
Stream.iterate()
Stream.iterate()可以用来生成无限流,函数需要两个参数:第一个参数是初始值、第二个参数用于确定怎么根据前一个元素的值生成下一个元素。
Stream.generate()
Stream.generate()也是用于生成一个无限流。参数用于获取每个元素。
Stream.build()
Stream.build()通过建造者模式生成一个Stream建造器。然后把需要加入Stream里面的数据源一个一个通过建造器添加进去。