0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Stream API原理介绍

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-30 15:31 次阅读

Stream APIJava 8 中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。


1. 原理介绍

Stream API 的核心是 Stream 接口,它表示一组元素的序列,可以按需进行计算。Stream 接口提供了大量的中间操作和终端操作,可以用于过滤、映射、排序、聚合等各种操作。

Stream API 的实现原理是基于两个核心概念:流和操作。

流(Stream)是一个数据序列,它可以由一个或多个操作组成。

流的操作可以分为两类:

  1. 中间操作:是指对流进行处理但不产生最终结果的操作;
  2. 终端操作:是指对流进行处理并返回最终结果的操作。

操作

操作(Operation)是对流进行处理的方法,操作可以分为中间操作和终端操作。

Stream API 提供了多种中间操作方法和终端操作方法,常用的中间操作方法包括 filter、map、sorted、distinct、limit 等,

常用的终端操作方法包括 forEach、collect、reduce 等。这些方法可以组合使用,构成一个操作链,最终返回一个最终结果。

操作链的执行是惰性求值的,即只有在需要计算结果时才进行计算。这种方式可以避免不必要的计算,并提高代码的执行效率。

语法介绍

Stream API 的语法基于一组接口和操作符,其中最常用的是 Stream 接口和它的中间操作方法和终端操作方法。以下是 Stream API 的基本语法。

创建 Stream 对象

可以通过集合、数组、IO 流、生成器等多种方式来创建 Stream 对象。

其中最常用的方式是通过集合创建 Stream 对象,例如:

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

中间操作方法

Stream 对象提供了多种中间操作方法,可以对 Stream 对象进行过滤、映射、排序、去重、限制等操作,常用方法包括:

  • filter:根据条件过滤 Stream 对象中的元素。
  • map:将 Stream 对象中的元素映射到新的值。
  • sorted:对 Stream 对象中的元素进行排序。
  • distinct:去重 Stream 对象中的元素。
  • limit:限制 Stream 对象中元素的数量。

例如:

List Integer > numbers = Arrays.asList(1, 2, 3, 4, 5);
List Integer > evenNumbers = numbers.stream()
                                    .filter(n - > n % 2 == 0)
                                    .sorted()
                                    .limit(2)
                                    .collect(Collectors.toList());

这里,首先使用 filter() 方法过滤出所有偶数,然后使用 sorted() 方法将它们排序,使用 limit() 方法限制数量,最后使用 collect() 方法将它们收集到一个列表中。

终端操作方法

Stream 对象提供了多种终端操作方法,可以将 Stream 对象转换为集合、数组、Map 对象,或者进行聚合操作,常用方法包括:

  • collect:将 Stream 对象中的元素收集到集合、数组、Map 对象等中。
  • reduce:对 Stream 对象中的元素进行聚合操作。
  • forEach:对 Stream 对象中的元素进行遍历操作。

例如:

List< Integer > numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                    .reduce(0, (a, b) - > a + b);

这里,使用 reduce() 方法对 Stream 对象中的所有元素进行求和操作。

综上所述,Stream API 的语法非常简单、直观,并且非常灵活,可以用于各种不同的编程任务,使得代码更加简洁、高效和易于维护。

优缺点

Stream API 它基于函数式编程思想,提供了一种简单、灵活、可读性极高的方式来处理集合和数组中的元素。

Stream API 的特点和优点包括:

  1. 简洁、高效、易于维护:Stream API 的方法链式调用,可以使代码更加简洁、易于阅读和维护。
  2. 支持并行处理:Stream API 支持对集合和数组中的元素进行并行处理,提高了处理效率。
  3. 支持惰性求值:Stream API 的操作是惰性求值的,只有在需要计算结果时才进行计算,避免了不必要的计算。
  4. 支持多种数据源:Stream API 可以处理多种不同类型的数据源,例如集合、数组、IO 流、生成器等。
  5. 支持多种操作:Stream API 提供了多种中间操作方法和终端操作方法,可以对数据进行过滤、映射、排序、去重、聚合等操作。
  6. 提高代码可读性:Stream API 的方法名和参数都非常直观,可以使代码更加可读性高。
  7. 可以组合使用:Stream API 的操作可以组合使用,构成一个操作链,最终返回一个最终结果。

不过,Stream API 也有一些缺点,例如学习成本较高、性能问题、代码可读性问题等。因此,在使用 Stream API 时需要根据实际情况进行选择。

使用示例

以下是一些常见的 Stream API 的用例:

过滤

使用filter()方法根据指定的条件过滤集合中的元素。例如,以下代码过滤出一个整数列表中的所有偶数:

List Integer > numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List Integer > evenNumbers = numbers.stream()
                                    .filter(n - > n % 2 == 0)
                                    .collect(Collectors.toList());

映射

使用map()方法将集合中的元素映射到新的值。例如,以下代码将一个字符串列表中的每个字符串转换为大写:

List String > strings = Arrays.asList("hello", "world");
List String > upperCaseStrings = strings.stream()
                                        .map(String::toUpperCase)
                                        .collect(Collectors.toList());

排序

使用sorted()方法根据指定的排序方式对集合中的元素进行排序。例如,以下代码将一个整数列表按照从小到大的顺序排序:

List Integer > numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);
List Integer > sortedNumbers = numbers.stream()
                                        .sorted()
                                        .collect(Collectors.toList());

聚合

使用reduce()方法对集合中的元素进行聚合操作。例如,以下代码计算一个整数列表中的所有元素的总和:

List< Integer > numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                    .reduce(0, (a, b) - > a + b);

Stream API 还支持并行处理集合和数组中的元素,从而提高了处理效率。可以使用parallelStream()方法将一个集合或数组转换为一个并行流,使得处理过程可以在多个线程上并行执行。

总结

Stream API是Java 8中最重要的新特性之一,它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,使得代码更加简洁、高效和易于维护。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7640

    浏览量

    148496
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60992
  • 终端
    +关注

    关注

    1

    文章

    998

    浏览量

    29599
  • Stream
    +关注

    关注

    0

    文章

    20

    浏览量

    7923
  • 语法
    +关注

    关注

    0

    文章

    40

    浏览量

    9669
收藏 人收藏

    评论

    相关推荐

    Stream模块的基础用法和进阶用法

    有用。在本教程中,我们将介绍 Stream 模块的基础用法和进阶用法,并提供示例。 基础用法 在本节中,我们将介绍 Stream 模块的基础用法,并提供基础示例。 从 Vec 中创建
    的头像 发表于 09-19 15:33 710次阅读

    Redis Stream应用案例

    摘要: Redis Stream Redis最新的大版本5.0已经RC1了,其中最重要的Feature莫过于Redis Stream了,关于Redis Stream的基本使用介绍和设计
    发表于 06-26 17:15

    介绍一下不带数据的Stream—Event

    在SpinalHDL中,Stream的抽象可谓诸多设计的核心,今天,一同来看下不带数据的Stream——Event。》不带数据的Stream在逻辑设计里,握手信号处处可见,在SpinalHDL里
    发表于 06-27 16:07

    一探究竟Java 8的Stream API性能

    已经对 Stream API 的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?
    的头像 发表于 05-04 14:20 1526次阅读
    一探究竟Java 8的<b class='flag-5'>Stream</b> <b class='flag-5'>API</b>性能

    AXI-Stream代码

    AXI-Stream代码详解 AXI4-Stream跟AXI4的区别在于AXI4-Stream没有ADDR接口,这样就不涉及读写数据的概念了,只有简单的发送与接收说法,减少了延时,允许无限制的数据
    的头像 发表于 11-05 17:40 2928次阅读
    AXI-<b class='flag-5'>Stream</b>代码

    如何利用Stream API来优化Java代码

    使用Stream API优化代码 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大
    的头像 发表于 07-26 14:30 1141次阅读

    关于AXI4-Stream协议总结分享

    XI4-Stream跟AXI4的区别就是AXI4-Stream去除了地址线,这样就不涉及读写数据的概念了,只有简单的发送与接收说法,减少了延时。由于AXI4-Stream协议(amba4_axi4_
    的头像 发表于 06-23 10:08 1840次阅读

    JDK8 Stream数据流效率分析

    Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型:Stream 代表对象引用流,此外还有一系列特化流,如 IntStream,LongStream
    的头像 发表于 08-17 10:53 971次阅读

    浅析Stream里的隐式转换

    Stream、Flow是在电路描述里经常用到的对象。
    的头像 发表于 05-15 17:36 308次阅读
    浅析<b class='flag-5'>Stream</b>里的隐式转换

    Video In to AXI4-Stream IP核知识介绍

    大家好!今日分享一些关于Video In to AXI4-Stream IP 核的知识。在具体学习IP核的过程中,我也将分享一些关于如何看xilinx英文文档的技巧。
    的头像 发表于 05-18 14:55 1059次阅读
    Video In to AXI4-<b class='flag-5'>Stream</b> IP核知识<b class='flag-5'>介绍</b>

    Stream-it!-RZ-V2快速入门指南

    Stream-it! - RZ-V2 快速入门指南
    发表于 07-10 18:58 0次下载
    <b class='flag-5'>Stream</b>-it!-RZ-V2快速入门指南

    怎么使用Java8的Stream API比较两个List的差异呢?

    可以使用Java8的Stream API来比较两个List的差异,并取出不同的对象。
    的头像 发表于 08-12 11:15 1584次阅读

    Stream的核心概念

    Stream 是 Rust 语言中的一种迭代器,它可以使得我们在处理数据时更加高效、灵活。Stream 不仅可以处理大量数据,还可以进行异步操作,这使得它在处理网络请求等 IO 操作时非常
    的头像 发表于 09-19 16:19 283次阅读

    Java8的Stream流 map() 方法

    之后,对集合可以进行 Stream 操作,使上面的处理更简洁。 概述 Stream 流式处理中有 map() 方法,先看下其定义,该方法在java.util.stream.Stream类中 可以看到
    的头像 发表于 09-25 11:06 716次阅读
    Java8的<b class='flag-5'>Stream</b>流 map() 方法

    Java的Stream的常用知识

    什么是Stream 生产线 Stream就像处理生产流水线一样去工作,传送带就是Stream的管道,每个工厂关注直接的生产,将上游产品加工成下游需要的产品。为什么Stream比传统的处
    的头像 发表于 10-11 15:45 255次阅读
    Java的<b class='flag-5'>Stream</b>的常用知识