一、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代码。