您的位置:

深入探讨Stream流

一、Stream简介

Stream是Java 8中提供的一种新的流式处理方法,它使得代码更简洁、易懂。它的主要作用是对数据集合进行一些列的操作,这些操作包括过滤、排序、映射、聚合等。

Stream并非数据结构,它不会改变原有的数据结构,仅是对其进行一系列的操作。另外,Stream的相关操作均支持链式操作,可以对多个操作进行组合。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream()
            .filter(x -> x > 2)
            .mapToInt(Integer::intValue)
            .sum();

二、Stream的操作分类

Stream的操作可以分为两类:中间操作和终止操作。

中间操作是指不执行任何操作时,Stream不会进行任何处理。中间操作可以对原有的Stream进行转换,例如去重、排序、过滤、映射等。中间操作都是惰性求值的,仅在需要时才会执行。

终止操作是指当执行某个终止操作时,Stream会执行中间操作,并且产生最终的结果。例如average、count、forEach、max、min、reduce、sum等。终止操作是及早求值的,一旦执行终止操作,Stream会立即执行中间操作,并计算出最终结果。

三、Stream的中间操作

1、过滤(filter)

过滤是Stream中最基本的操作之一,它可以通过lambda表达式对原有的Stream进行过滤。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> newList = list.stream()
                              .filter(x -> x <= 3)
                              .collect(Collectors.toList());
//输出结果:[1, 2, 3]

2、映射(map)

映射是Stream中对元素进行转换的操作,它将一个Stream中的所有元素映射成另外一个Stream。例如对于一个Stream<String>,可以将其转换成Stream<Integer>。


List<Integer> list = Arrays.asList(1, 2, 3);
List<Integer> newList = list.stream()
                              .map(x -> x * x)
                              .collect(Collectors.toList());
//输出结果:[1, 4, 9]

3、拓展映射(flatMap)

flatMap与map类似,它也是对元素进行转换,不同的是,flatMap可以转换成多个元素,而非单个元素。


List<Integer> list1 = Arrays.asList(1, 2);
List<Integer> list2 = Arrays.asList(3, 4);
List<Integer> list3 = Arrays.asList(5, 6);

List<List<Integer>> lists = Arrays.asList(list1, list2, list3);
List<Integer> newList = lists.stream()
                              .flatMap(x -> x.stream())
                              .collect(Collectors.toList());
//输出结果:[1, 2, 3, 4, 5, 6]

4、去重(distinct)

去重是指删除Stream中重复的元素。


List<Integer> list = Arrays.asList(2, 4, 2, 5, 4, 7);
List<Integer> newList = list.stream()
                              .distinct()
                              .collect(Collectors.toList());
//输出结果:[2, 4, 5, 7]

5、截取(limit、skip)

limit是指从Stream中截取指定的元素,skip是指跳过指定数量的元素。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> newList = list.stream()
                              .skip(2)  //跳过前2个元素
                              .limit(2)  //截取前2个元素
                              .collect(Collectors.toList());
//输出结果:[3, 4]

6、排序(sorted)

排序是指对Stream中的元素进行排序。


List<Integer> list = Arrays.asList(5, 3, 1, 4, 2);
List<Integer> newList = list.stream()
                              .sorted()
                              .collect(Collectors.toList());
//输出结果:[1, 2, 3, 4, 5]

四、Stream的终止操作

1、计数(count)

计数是指统计Stream中元素的个数。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream()
                 .count();
//输出结果:5

2、求和(sum)

求和是指对Stream中的元素进行求和操作。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream()
             .mapToInt(Integer::intValue)
             .sum();
//输出结果:15

3、平均数(average)

平均数是指对Stream中的元素进行求平均值操作。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
double average = list.stream()
                     .mapToInt(Integer::intValue)
                     .average()
                     .getAsDouble();
//输出结果:3.0

4、最大值(max)

最大值是指对Stream中的元素进行求最大值操作。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int max = list.stream()
              .mapToInt(Integer::intValue)
              .max()
              .getAsInt();
//输出结果:5

5、最小值(min)

最小值是指对Stream中的元素进行求最小值操作。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int min = list.stream()
              .mapToInt(Integer::intValue)
              .min()
              .getAsInt();
//输出结果:1

6、输出结果(forEach)

输出结果是指对Stream中的每个元素执行特定的操作。例如将结果输出到控制台。


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
    .forEach(System.out::println);
//输出结果:1 2 3 4 5

五、总结

Stream是Java 8中新增的强大工具,它可以使得代码变得更加简洁、易维护。Stream可以对集合进行一系列的操作,例如过滤、映射、排序、聚合等,其中各种操作都支持链式操作,可以非常方便的进行组合。

总之,学习Stream可以帮助我们写出更加高效、简洁、易维护的Java代码。