自学内容网 自学内容网

ChatGPT:Stream 和 传统遍历循环的对比

ChatGPT:Stream 和 传统遍历循环的对比



传统循环遍历代码

假设我们有一个 List<String>,我们希望对它进行排序,然后筛选出以 “a” 开头的元素,并打印它们。传统的循环遍历代码可能如下:

List<String> stringList = Arrays.asList("bbb", "aaa2", "ccc", "aaa1");

// 排序
List<String> sortedList = new ArrayList<>(stringList);
Collections.sort(sortedList);

// 筛选
List<String> filteredList = new ArrayList<>();
for (String s : sortedList) {
    if (s.startsWith("a")) {
        filteredList.add(s);
    }
}

// 打印
for (String s : filteredList) {
    System.out.println(s);
}
使用 Stream API 的代码

使用 Stream API,可以将上述操作链式地写成:

List<String> stringList = Arrays.asList("bbb", "aaa2", "ccc", "aaa1");

stringList.stream()
          .sorted()
          .filter(s -> s.startsWith("a"))
          .forEach(System.out::println);
比较与分析
1. 代码简洁性
  • 传统方法:需要多个步骤(排序、筛选、打印),每个步骤都需要明确的循环结构和临时集合。
  • Stream 方法:使用链式调用,减少了显式的循环和临时集合的创建,使代码更加简洁和易读。
2. 中间结果的处理
  • 传统方法:每个步骤的中间结果都需要显式存储在集合中(如 sortedListfilteredList),这会增加内存消耗。
  • Stream 方法:中间操作是惰性求值的,不会立即生成中间结果。只有在终端操作触发时,所有操作才会按需执行,并不会显式存储中间结果,避免了不必要的内存消耗。
3. 性能优化
  • 惰性求值(Lazy Evaluation):Stream 的中间操作(如 sortedfilter)都是惰性求值的,意味着它们只是记录了操作,而不会立即执行。只有在遇到终端操作(如 forEach)时,才会遍历数据并执行所有中间操作。这避免了不必要的计算和内存使用。
  • 优化执行顺序:在流处理中,可以将多个操作结合起来一次遍历完成。例如,在传统方法中,排序和筛选是分两步完成的。而在 Stream 中,这些操作是可以组合在一起完成的,减少了遍历次数。
4. 并行处理
  • 传统方法:需要手动处理多线程并发,代码复杂度高,容易出错。
  • Stream 方法:通过简单地调用 parallelStream(),可以轻松实现数据的并行处理,利用多核 CPU 提高性能。
5. 可读性和可维护性
  • 传统方法:由于步骤多且显式操作中间集合,代码复杂且容易出错。
  • Stream 方法:链式调用使得逻辑更加清晰,一目了然,更容易维护和修改。


原文地址:https://blog.csdn.net/XRT_knives/article/details/140525713

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!