【编程随笔】Stream流的使用

当我们需要对一个集合进行筛选、映射、排序等操作时,通常需要使用for循环或者迭代器等方式遍历集合中的每个元素。Java 8引入了Stream API,可以使得这些操作变得更加简洁、易于理解和维护。Stream API是一种基于管道和过滤器的编程模型,它的设计初衷是为了简化集合的处理,提高代码的可读性和易用性。

Stream API 的核心是Stream接口,它代表了一个元素的序列,并且支持各种操作。Stream操作可以分为两类:中间操作和终止操作。中间操作是返回Stream的操作,例如筛选、映射和排序等,它们支持链式调用。而终止操作是返回非Stream的操作,例如forEach、reduce和collect等,它们是对Stream执行计算的终止点。

下面是一些常见的Stream操作:

筛选:filter方法根据给定的条件过滤Stream中的元素,返回一个新的Stream。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
Stream<Integer> filteredStream = stream.filter(x -> x % 2 == 0);

映射:map方法根据给定的转换规则将Stream中的元素映射成一个新的Stream。

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
Stream<Integer> mappedStream = stream.map(String::length);

排序:sorted方法可以按照指定的排序规则对Stream中的元素进行排序,返回一个新的Stream。

List<Integer> list = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6);
Stream<Integer> stream = list.stream();
Stream<Integer> sortedStream = stream.sorted();

统计:count、max、min、sum、average等方法可以对Stream中的元素进行统计,返回一个结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
long count = stream.count();
int max = list.stream().max(Integer::compareTo).get();
int min = list.stream().min(Integer::compareTo).get();
int sum = list.stream().mapToInt(Integer::intValue).sum();
double average = list.stream().mapToInt(Integer::intValue).average().getAsDouble();

终止操作:forEach、reduce和collect等方法可以对Stream进行终止操作,返回一个结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(System.out::println);
int sum = list.stream().reduce(0, Integer::sum);
List<Integer> evenNumbers = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());

Stream API的优点在于它可以使得集合处理变得更加简洁和易于维护,同时还支持并行处理。

除了常见的操作之外,Stream API还有一些高级操作,例如并行处理、flatMap、peek等。

并行处理:Stream API可以支持并行处理,通过调用parallel方法可以将Stream转换为一个并行流,这样可以加快大规模数据的处理速度。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.parallelStream();
stream.forEach(System.out::println);

flatMap:flatMap方法可以将一个Stream中的每个元素映射成一个Stream,并将所有Stream中的元素合并成一个新的Stream返回。

List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6));
Stream<Integer> stream = lists.stream().flatMap(Collection::stream);

peek:peek方法可以在Stream的每个元素被处理时执行一个操作,例如调试、日志等。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream().peek(System.out::println);

总的来说,Stream API是Java 8中非常有用和值得学习的特性之一。它可以使得集合处理更加简洁、易于理解和维护,同时还支持并行处理、flatMap、peek等高级操作。掌握Stream API可以大大提高Java程序员的编程效率和代码质量。

end
  • 作者:dicraft(联系作者)
  • 更新时间:2023-03-16 14:36
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 评论

    新增邮件回复功能,回复将会通过邮件形式提醒,请填写有效的邮件!