首页 > Java > java教程 > 正文

java使用教程怎样使用StreamAPI处理集合 java使用教程的Stream操作实用指南​

蓮花仙者
发布: 2025-08-15 23:20:01
原创
249人浏览过
Stream API是Java 8引入的声明式处理集合的工具,支持链式调用中间操作(如filter、map、sorted)和终端操作(如collect、reduce),实现高效的数据处理。

java使用教程怎样使用streamapi处理集合 java使用教程的stream操作实用指南​

Stream API是Java 8引入的强大工具,它允许你以声明式的方式处理集合数据。简单来说,Stream API提供了一种更简洁、更高效的方式来执行过滤、映射、排序等操作,而无需编写大量的循环代码。

Stream API本质上是对集合进行一系列操作的管道。

Stream API的核心在于其操作的管道化和延迟执行。它允许你链式调用多个操作,而这些操作只有在遇到终端操作时才会真正执行。这种延迟执行的特性可以提高性能,因为它避免了不必要的中间结果的生成。

Stream API的基本操作有哪些?

Stream API提供了一系列的操作,可以分为两类:中间操作和终端操作。

立即学习Java免费学习笔记(深入)”;

  • 中间操作:返回Stream对象,允许链式调用其他操作。常见的中间操作包括:
    filter
    登录后复制
    登录后复制
    登录后复制
    (过滤)、
    map
    登录后复制
    登录后复制
    登录后复制
    (映射)、
    flatMap
    登录后复制
    (扁平化映射)、
    sorted
    登录后复制
    登录后复制
    (排序)、
    distinct
    登录后复制
    (去重)、
    peek
    登录后复制
    (查看)等。
  • 终端操作:返回一个非Stream对象,触发Stream的执行。常见的终端操作包括:
    forEach
    登录后复制
    (循环)、
    toArray
    登录后复制
    (转换为数组)、
    collect
    登录后复制
    (收集)、
    reduce
    登录后复制
    登录后复制
    登录后复制
    (归约)、
    count
    登录后复制
    (计数)、
    min
    登录后复制
    (最小值)、
    max
    登录后复制
    (最大值)、
    anyMatch
    登录后复制
    (任意匹配)、
    allMatch
    登录后复制
    (全部匹配)、
    noneMatch
    登录后复制
    (全部不匹配)、
    findFirst
    登录后复制
    (查找第一个)、
    findAny
    登录后复制
    (查找任意一个)等。

例如,假设我们有一个整数列表,想要过滤出其中的偶数,然后将每个偶数乘以2,最后计算结果的总和,使用Stream API可以这样实现:

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

int sum = numbers.stream()
                .filter(n -> n % 2 == 0) // 过滤偶数
                .map(n -> n * 2)         // 将每个偶数乘以2
                .reduce(0, Integer::sum);  // 计算总和

System.out.println("Sum: " + sum); // 输出:Sum: 60
登录后复制

这段代码首先通过

numbers.stream()
登录后复制
将列表转换为Stream对象。然后,使用
filter
登录后复制
登录后复制
登录后复制
方法过滤出偶数,
map
登录后复制
登录后复制
登录后复制
方法将每个偶数乘以2,最后使用
reduce
登录后复制
登录后复制
登录后复制
方法计算总和。注意,
reduce
登录后复制
登录后复制
登录后复制
方法接受两个参数:初始值(这里是0)和一个累加器函数(这里是
Integer::sum
登录后复制
)。

如何使用Stream API进行集合的过滤、映射和排序?

Stream API的强大之处在于它可以方便地进行集合的过滤、映射和排序。

  • 过滤

    filter
    登录后复制
    登录后复制
    登录后复制
    方法接受一个Predicate函数式接口作为参数,用于判断元素是否应该被包含在结果中。

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
    
    List<String> longNames = names.stream()
                                  .filter(name -> name.length() > 4) // 过滤长度大于4的字符串
                                  .collect(Collectors.toList());      // 将结果收集到List中
    
    System.out.println(longNames); // 输出:[Alice, Charlie, David]
    登录后复制
  • 映射

    map
    登录后复制
    登录后复制
    登录后复制
    方法接受一个Function函数式接口作为参数,用于将一个元素转换为另一个元素。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    
    List<Integer> squares = numbers.stream()
                                   .map(n -> n * n) // 将每个元素平方
                                   .collect(Collectors.toList()); // 将结果收集到List中
    
    System.out.println(squares); // 输出:[1, 4, 9, 16, 25]
    登录后复制
  • 排序

    sorted
    登录后复制
    登录后复制
    方法用于对Stream中的元素进行排序。可以传入一个Comparator函数式接口作为参数,用于自定义排序规则。

    List<String> names = Arrays.asList("Charlie", "Alice", "Bob", "David", "Eve");
    
    List<String> sortedNames = names.stream()
                                     .sorted() // 默认按字母顺序排序
                                     .collect(Collectors.toList()); // 将结果收集到List中
    
    System.out.println(sortedNames); // 输出:[Alice, Bob, Charlie, David, Eve]
    
    // 自定义排序规则,按字符串长度排序
    List<String> sortedNamesByLength = names.stream()
                                             .sorted(Comparator.comparingInt(String::length))
                                             .collect(Collectors.toList());
    
    System.out.println(sortedNamesByLength); // 输出:[Bob, Eve, Alice, David, Charlie]
    登录后复制

Stream API的并行处理有什么优势和注意事项?

Stream API支持并行处理,可以利用多核CPU的优势,提高处理效率。通过调用

parallelStream()
登录后复制
方法,可以将一个Stream转换为并行Stream。

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
    numbers.add(i);
}

// 串行处理
long startTime = System.nanoTime();
int sum = numbers.stream()
                .filter(n -> n % 2 == 0)
                .map(n -> n * 2)
                .reduce(0, Integer::sum);
long endTime = System.nanoTime();
System.out.println("Serial Sum: " + sum + ", Time: " + (endTime - startTime) / 1000000 + "ms");

// 并行处理
startTime = System.nanoTime();
sum = numbers.parallelStream()
            .filter(n -> n % 2 == 0)
            .map(n -> n * 2)
            .reduce(0, Integer::sum);
endTime = System.nanoTime();
System.out.println("Parallel Sum: " + sum + ", Time: " + (endTime - startTime) / 1000000 + "ms");
登录后复制

并行处理的优势在于可以显著提高处理大规模数据的速度。但是,并行处理也存在一些注意事项:

  • 线程安全:在使用并行Stream时,需要确保操作是线程安全的。例如,不要在并行Stream中修改共享变量,否则可能导致数据竞争。
  • 性能损耗:并行处理会带来额外的线程管理开销。对于小规模数据,并行处理可能比串行处理更慢。
  • 调试困难:并行处理的调试比串行处理更困难,因为线程的执行顺序是不确定的。

总的来说,Stream API是Java中处理集合数据的利器。掌握Stream API的基本操作和注意事项,可以编写出更简洁、更高效的代码。当然,也要注意根据实际情况选择合适的处理方式,避免过度使用并行处理。

以上就是java使用教程怎样使用StreamAPI处理集合 java使用教程的Stream操作实用指南​的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号