首页 > 编程语言 >Java --- Stream

Java --- Stream

时间:2024-08-05 11:26:26浏览次数:13  
标签:Java Stream stream Arrays List --- 操作 asList

Java 8 引入了 Stream API,它提供了一种高效且易于表达的方式来处理集合数据。Stream API 允许你以声明式的方式处理数据,支持函数式编程风格,使得代码更加简洁和易读。以下是关于 Java Stream 流的详细介绍:

1. Stream 流的基本概念

Stream 流是对集合(Collection)数据进行操作的抽象,它可以进行各种操作,如过滤、映射、排序、聚合等。Stream 流不是数据结构,它不存储数据,而是通过管道(pipeline)的方式对数据进行处理。

2. Stream 流的创建

2.1 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
2.2 从数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
2.3 使用 Stream.of 创建
Stream<String> stream = Stream.of("a", "b", "c");
2.4 创建无限流
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);

3. Stream 流的操作

Stream 流的操作分为两种类型:中间操作(intermediate operations)和终端操作(terminal operations)。

3.1 中间操作

中间操作返回一个新的 Stream 流,可以进行链式调用。常见的中间操作包括:

  • filter:过滤元素
  • map:映射元素
  • flatMap:扁平化映射
  • distinct:去重
  • sorted:排序
  • peek:调试操作
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
    .filter(name -> name.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());
3.2 终端操作

终端操作触发流的处理并产生结果。常见的终端操作包括:

  • forEach:遍历元素
  • collect:收集元素到集合
  • reduce:聚合操作
  • count:计数
  • anyMatch:任意匹配
  • allMatch:全部匹配
  • noneMatch:无匹配
  • findFirst:查找第一个元素
  • findAny:查找任意元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
    .filter(n -> n % 2 == 0)
    .reduce(0, Integer::sum);

4. Stream 流的特性

4.1 惰性求值

Stream 流的操作是惰性求值的,即直到终端操作时才会真正执行。这样可以提高性能,避免不必要的计算。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5)
    .filter(n -> {
        System.out.println("Filter: " + n);
        return n % 2 == 0;
    });

System.out.println("Before terminal operation");
stream.forEach(System.out::println);
4.2 并行流

Stream 流支持并行处理,通过 parallelStream 方法可以创建并行流,利用多核处理器提高处理速度。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
    .filter(n -> n % 2 == 0)
    .reduce(0, Integer::sum);

5. Stream 流的示例

5.1 过滤和映射
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
    .filter(name -> name.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());
5.2 去重和排序
List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2, 3, 5);
List<Integer> distinctSortedNumbers = numbers.stream()
    .distinct()
    .sorted()
    .collect(Collectors.toList());
5.3 聚合操作
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
    .filter(n -> n % 2 == 0)
    .reduce(0, Integer::sum);
5.4 分组和统计
List<Person> people = Arrays.asList(
    new Person("Alice", 25),
    new Person("Bob", 30),
    new Person("Charlie", 25)
);

Map<Integer, List<Person>> peopleByAge = people.stream()
    .collect(Collectors.groupingBy(Person::getAge));

Map<Integer, Long> countByAge = people.stream()
    .collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));

6. Stream 流的注意事项

6.1 避免修改流的数据源

在流操作过程中,应避免修改流的数据源,否则可能导致不确定的行为。

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Stream<String> stream = list.stream();
list.add("d"); // 避免在流操作过程中修改数据源
stream.forEach(System.out::println);
6.2 避免多次使用同一个流

流一旦被终端操作消费,就不能再次使用。

Stream<String> stream = Stream.of("a", "b", "c");
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出 IllegalStateException

7. 总结

Java Stream API 提供了一种强大且灵活的方式来处理集合数据。通过 Stream 流,你可以以声明式的方式进行数据处理,支持惰性求值和并行处理,使得代码更加简洁和高效。希望这些内容能够帮助你更好地理解和应用 Java Stream 流。

标签:Java,Stream,stream,Arrays,List,---,操作,asList
From: https://blog.csdn.net/xycxycooo/article/details/140881688

相关文章

  • KingbaseES RAC部署案例之---SAN环境构建RAC
    案例说明:通过iscsi共享存储作为数据库存储文件系统,构建KingbaseESRAC架构。适用版本:KingbaseESV008R006C008M030B0010操作系统版本:[root@node201KingbaseHA]#cat/etc/centos-releaseCentOSLinuxrelease7.9.2009(Core)集群架构:如下所示,node1和node2为集群节点:......
  • uniapp中u-input点击事件失效
    uniapp中u-input点击事件失效当给u-input设置了disabled/readonly属性后,pc浏览器中点击事件失效,但是app/移动端h5中却仍有效解决办法给外边包上一个盒子设置点击事件,给input加上css属性:pointer-events:nonepointer-eventsCSS属性指定在什么情况下(如果有)某个特定的图......
  • vue-seamless-scroll插件点击事件不生效
    vue-seamless-scroll点击事件不生效问题:在使用此插件时发现,列表内容前几行还是能正常点击的,但是从第二次出现的列表开始就没有点击事件了原因:因为html元素是复制出来的(滚动组件是将后面的复制出来一份,进行填铺页面,方便滚动)解决:往滚动组件的父节点上添加绑定事件(js冒泡机制),通过......
  • 后端开发学习敏捷需求-->产品价值的定位
    产品价值的定位为什么要写这一系列文章2023年网上报名学习了,敏捷软件需求的培训课程,一直都没有进行回顾,回顾学习,总结业务分析的能力偏弱,学习和了解关于业务需求相关的方法和理论每一年都有一段时间的清醒期,不做点啥事情,容易迷茫和精神内耗很多视角都是通过自身的认知出发,分......
  • 【高录用!Fellow 主讲!SPIE独立出版 | 往届均已EI检索】第四届先进算法与神经网络国际学
    第四届先进算法与神经网络国际学术会议(AANN2024)由中国石油大学(华东)及山东省可信人工智能生态数据开放创新应用实验室联合主办,会议将于2024年8月9-11日在中国·青岛召开。AANN2024将围绕“先进算法与神经网络”的最新研究领域,为来自国内外高等院校、科学研究所、企事业......
  • (峰绍)FU6831/11/18 QFN-48/LQFP 单片机嵌入式和可配置的三相BLDC/PMSM电机控制器场定向
    产品描述FU6831/11/18系列是一款集成电机控制引擎(ME)和8051内核的电机驱动专用芯片。ME集成FOC、MDU、LPF、PI、SVPWM/SPWM等诸多硬件模块,可硬件自动完成电机FOC/BLDC运算控制;8051内核用于参数配置和日常事务处理,双核并行工作实现各种高性......
  • 卷积神经网络 - 基本卷积函数的变体篇
    序言在深度学习和卷积神经网络(CNN\text{CNN}CNN)的广阔领域中,基本卷积函数是构建网络结构的基础,它们通过滑动窗口的方式对输入数据进行特征提取。然而,随着应用场景和数据......
  • ISO 26262中的失效率计算:IEC TR 62380-Section 10-Capacitors and thermistors (NTC)
    目录概要1电容器和热敏电阻器的分类2电容器失效率的计算2.1 Fixedplastic,paper,dielectriccapacitors2.1.1 温度De-rating系数2.1.2温度循环De-rating系数 2.2 Fixedceramicdielectriccapacitors–Definedtemperaturecoefficient–ClassI 2.2.......
  • 快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ
    序言之前已经介绍了在超算互联网平台SCNet上使用异构加速卡AI显存64GBPCIE,私有化部署Llama3模型,并对Llama3-8B-Instruct模型进行LoRA微调、推理和合并,详细内容请参考另一篇博客:快速体验LLaMA-Factory私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DC......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位
    1.简介今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大、懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考。2.SVG简介svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。但是svg绘制出来的都是矢量图,不像canv......