Java8 Stream流操作深度解析(java stream流操作包括哪些部分)

Java8 Stream流操作深度解析(java stream流操作包括哪些部分)

编程文章jaq1232025-05-02 17:43:2910A+A-

Java8 Stream流操作深度解析

提到Java8,你脑海里第一个浮现的是什么?是Lambda表达式?还是Optional类?其实,Java8引入的Stream API也是相当重要且强大的特性之一。今天,咱们就来聊聊这个让人又爱又恨的Stream流操作。



什么是Stream?

简单来说,Stream就是一个数据处理管道,它可以让你像流水线一样处理集合中的元素。你可以把它想象成一条河,河里的水就是你要处理的数据,而Stream就是这条河,你可以在这个河里进行过滤、筛选、映射等一系列操作。

比如,你有一堆数字,你想从中找到所有的偶数,然后把它们平方,最后再求和。用传统的循环方式可能需要好几行代码,但有了Stream,你只需要几行代码就能搞定。

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

int sumOfSquares = numbers.stream()
                          .filter(n -> n % 2 == 0) // 只保留偶数
                          .mapToInt(n -> n * n)    // 将每个数平方
                          .sum();                  // 求和

System.out.println("Sum of squares of even numbers: " + sumOfSquares);

Stream的操作类型

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



中间操作

中间操作会返回一个新的Stream,允许你链式调用多个操作。常见的中间操作有:

  • filter:用于过滤元素。
  • map:用于映射元素。
  • sorted:用于排序。
  • distinct:用于去重。
List<String> words = Arrays.asList("apple", "banana", "cherry", "date");

List<String> upperCaseWords = words.stream()
                                   .filter(word -> word.length() > 5)
                                   .map(String::toUpperCase)
                                   .sorted()
                                   .collect(Collectors.toList());

System.out.println(upperCaseWords);

终端操作

终端操作会触发实际的遍历操作,并返回一个结果或者执行某些操作。常见的终端操作有:

  • forEach:对每个元素执行操作。
  • collect:将流中的元素收集到集合中。
  • reduce:归约操作。
  • count:统计元素数量。
long count = words.stream()
                  .filter(word -> word.contains("a"))
                  .count();

System.out.println("Number of words containing 'a': " + count);

并行流的魅力

如果你的机器有多核处理器,那么使用并行流可以让流操作充分利用硬件资源,提高性能。并行流的使用非常简单,只需将.stream()换成.parallelStream()即可。

List<Integer> numbers = IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());

int sum = numbers.parallelStream()
                .filter(n -> n % 2 == 0)
                .mapToInt(Integer::intValue)
                .sum();

System.out.println("Sum of even numbers using parallel stream: " + sum);

不过要注意,虽然并行流可以提高性能,但也可能带来一些意想不到的问题,比如顺序问题。所以,在使用并行流时一定要小心。

Stream操作的小技巧

这里有一些使用Stream时的小技巧,希望能帮到你。

  1. 空安全:当你不确定集合是否为空时,可以用Stream.ofNullable()来创建流。
String[] arr = null;
Stream<String> stream = Stream.ofNullable(arr);
  1. 默认值:如果你想在流中包含默认值,可以用Stream.concat()。
Stream<String> stream = Stream.concat(Stream.of("a", "b"), Stream.of("default"));
  1. 生成无限流:你可以使用Stream.generate()来生成无限流。
Stream<Double> randomNumbers = Stream.generate(Math::random);

总结

Stream流操作确实是一个强大的工具,它能够让我们的代码更加简洁优雅。不过,就像任何工具一样,Stream也有它的局限性和适用场景。希望大家在使用Stream时,能够根据实际情况做出最佳选择,而不是盲目追求“代码的简洁”。

记住,编程不仅仅是写代码,更是解决问题的艺术。希望今天的Stream流操作深度解析能给你带来一些新的灵感!


点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21