您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java中的Steam流

时间:2023-07-12 17:02:15  来源:  作者:京东云开发者

作者 | 京东云开发者-京东物流 王辰玮

1 引言

在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用到并行处理,这样的处理方式是很复杂的。流可以帮助开发者节约宝贵的时间,让以上的事情变得轻松。

2 流简介

流到底是什么呢?简要的定义为 “从支持数据处理操作的源生成的元素序列”,接下来对于这个定义进行简要分析。

2.1 支持数据处理操作

流的数据处理操作和数据库的可以声明式的指定分组或查找等功能支持类似,和函数式编程的思想一致,如 filter、map、reduce、find、match、sort 等操作,这些流操作可以串行执行,也可以并行执行。

2.2 源

流会使用一个提供数据的源,可以通过三种方式来创建对象流,一种是由集合对象创建流:

List<Integer> list= Arrays.asList( 111, 222, 333);

Stream<Integer> stream = list.stream;

一种是由数组创建流:

IntStream stream = Arrays.stream( newint{ 111, 222, 333});

一种是由静态方法 Stream.of 创建流,底层还是 Arrays.stream :

Stream<Integer>stream=Stream.of(111,222,333);

Stream stream = Stream.of(111, 222, 333);

从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。

还有两种特殊的流:

  • 空流:Stream.empty
  • 无限流:Stream.genarate
2.3 元素序列

流也可以和集合一样访问包含特定的元素类型的一组有序值,但是它们的主要目的不一样,集合的主要目的是在于存储和访问元素,流的主要目的在于表达计算。

3 流的思想

流式思想和生产中的流水线具有异曲同工之妙,很多流模型都会返回一个流,这些模型都只负责它所需要做的事情,并不需要格外的内存空间来存储处理的结果。这些流模型可以被链接起来形成一个大的流水线,我们在这个过程中不关注中间步骤的数据被如何处理,只需要使用整个流水线处理后的结果。接下来的代码可以体现这种思想,代码中以商品为例,我们要筛选出商品中体积大于 200 的前两个商品的名字。

首先是商品类的定义:

publicclassGoods{

privatefinalString Name;

privatefinalInteger Volume;

publicGoods(String name, Integer volume){

Name = name;

Volume = volume;

}

publicString getName{

returnName;

}

publicInteger getVolume{

returnVolume;

}

}

接下来是商品集合的定义:

List<Goods> goods = Arrays.asList( newGoods( "土豆", 10),

newGoods( "冰箱", 900), newGoods( "办公椅", 300));

接下来获取我们想要的结果:

List< String> twofoods = goods.stream //获取流

.filter(goods1 -> goods1.getVolume> 200) //筛选商品体积大于200的

.map(Goods::getName) //获取商品名称

.limit( 2) //筛选头两个商品

.collect(Collectors.toList); //将结果保存在list中

这样看来,通过流来处理我们的特定需求,是不是比使用集合的迭代要方便很多呢?

4 流处理的特性

  • 不存储数据
  • 不会改变数据源
  • 只可被使用一次

这里我们使用一个测试类 StreamCharacteristic 来验证流处理的以上特性:

importorg.springframework.util.Assert;

importJAVA.util.Arrays;

importjava.util.List;

importjava.util.stream.Collectors;

importjava.util.stream.Stream;

publicclassStreamCharacteristic{

publicvoidtest1{

List<Integer> list= Arrays.asList( 1, 2, 2, 5, 6, 9);

list.stream.distinct;

System.out.println( list.size);

}

publicvoidtest2{

List<String> list= Arrays.asList( "wms", "KA", "5.0");

Stream<String> stream = list.stream;

stream.forEach(System.out::println);

stream.forEach(System.out::println);

}

}

test1 中的结果为 6,尽管我们对于 list 对象所生成的 Stream 流做了去重操作 distinct ,但是不影响数据源 list。

test2 中调用了两次 stream.forEach 方法来打印每一个单词,第二次调用时,抛出了一个 “java.lang.IllegalStateException” 异常:“stream has already been operated upon or closed”。这说明流不存储数据,遍历完后这个流已经被消费掉了,而且流不可以重复使用。

5 流操作与流的使用

将所有的流操作连接起来可以组合成一个管道,管道有两类操作:中间操作和终端操作。

StreamAPI 常用的中间操作有:filter,map,limit,sorted,distinct。

StreamAPI 常用的终端操作有:forEach,count,collect。

在使用流的时候,主要需要三个要素:一个用来执行查询的数据源,用来形成一条流的流水线的中间操作链,一个能够执行流水线并能生成结果的终端操作。

下图展示了流的整个操作流程:

6 总结

  • 流是从支持数据处理操作的源生成的元素序列
  • 流的思想类似于生产中的流水线
  • 流不存储数据,不改变数据源,只能被改变一次
  • 流的操作主要分为中间操作和终端操作两大类


Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
作者 | 京东云开发者-京东物流 王辰玮1 引言在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进...【详细内容】
2023-07-12  Tags:   点击:(0)  评论:(0)  加入收藏
装备鉴定真是梦幻西游世界中一项神奇的玩法,今天沉迷于这个游戏的玩家们都在争相鉴定各种装备,有那么幸运的一些人鉴定出了奇特的极品装备,下面就让我们一起来看看这些装备的样...【详细内容】
2023-07-12  Tags:   点击:(4)  评论:(0)  加入收藏
Linux 下面有两个概念可能大家接触的比较多,一个是 sudo 命令,还有一个是 root 账户。Sudo 命令可以以最高权限执行命令,而 root 账户下所有命令都有最高权限,也就是相当于所有...【详细内容】
2023-07-12  Tags:   点击:(3)  评论:(0)  加入收藏
电动汽车一直以来是特斯拉的主要收入来源,但随着特斯拉超级充电网称霸北美,新的“现金奶牛”或许已经出现。截至目前,福特、通用和至少四家其他车企已宣布计划采用特斯拉专有插...【详细内容】
2023-07-12  Tags:   点击:(4)  评论:(0)  加入收藏
克雷西 发自 凹非寺量子位 | 公众号 QbitAI用ChatGPT最新推出的代码解释器,5分钟就能做出一款游戏!这可不是乱说的,有位博主已经放出了一段DEMO:这是一款以太空为背景,让飞船打击...【详细内容】
2023-07-12  Tags:   点击:(4)  评论:(0)  加入收藏
图片来源@视觉中国文|市值观察,作者|文雨,编辑|小市妹技术推动,资本热潮,政策扶持,人形机器人这把火越烧越旺,太平洋两岸的两个超级大国已经为此展开了新的技术竞赛。在西八区,马斯克...【详细内容】
2023-07-12  Tags:   点击:(2)  评论:(0)  加入收藏
新京报贝壳财经讯(记者白金蕾)7 月 11 日,Apple Store (苹果商店)官方在线商店在微信小程序上线 。图/微信截图微信小程序上的 Apple Store 官方在线商店将为微信生态内的用户提...【详细内容】
2023-07-12  Tags:   点击:(3)  评论:(0)  加入收藏
图片来源@视觉中国文|深瞳商业,作者 | 楚青舟小红书种草后,喜马拉雅播客“种树”,似乎正在成为一门新生意。互联网营销市场的变化总是很有意思:就在前两年,品牌从业者们还觉得没办...【详细内容】
2023-07-12  Tags:   点击:(3)  评论:(0)  加入收藏
几天前,谷歌突然更新了隐私政策,明确表示要用网上所有的公开数据,来训练自家的 AI 模型。也就是说,根据新政策,你在网上公开发布的任何信息都有可能被谷歌抓取,包括但不限于你发的...【详细内容】
2023-07-12  Tags:   点击:(3)  评论:(0)  加入收藏
拥有长达两个月假期的暑期,一直都是各大游戏厂商每年必争的档期。今年的暑期当然也不意味,各大游戏厂商都已经备战暑期档,其中不乏广大玩家耳熟能详的知名厂商,比如腾讯、网易等...【详细内容】
2023-07-12  Tags:   点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
作者 | 京东云开发者-京东物流 王辰玮1 引言在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进...【详细内容】
2023-07-12  京东云开发者    Tags:   点击:(0)  评论:(0)  加入收藏
我觉得 Java 在未来会被替代的可能性很小,但也不能掉以轻心,在后端开发领域,Go 已经在逐步蚕食 Java 得份额,今年非常火得 ai 模型领域相关,大部分代码也是基于 Python 编写。Jav...【详细内容】
2023-07-07  waynblog    Tags:Java   点击:(15)  评论:(0)  加入收藏
在Java中,继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,并可以在此基础上添...【详细内容】
2023-07-07    Java技术指北  Tags:Java   点击:(13)  评论:(0)  加入收藏
Java作为一门常用的编程语言,其基础知识的学习是非常重要的。而Java基础文档则是学习这门语言的必备资料之一。那么,Java基础文档内容一般包括什么呢?一、概述Java基础文档的概...【详细内容】
2023-07-03  动力节点Java程序员    Tags:Java   点击:(6)  评论:(0)  加入收藏
1 背景前段时间组内针对 “拷贝实例属性是应该用 BeanUtils.copyProperties()还是 MapStruct” 这个问题进行了一次激烈的 battle。支持 MapStruct 的同学给出了他嫌弃 BeanUt...【详细内容】
2023-06-29  京东云开发者    Tags:Java   点击:(24)  评论:(0)  加入收藏
sendfile实现的零拷贝,I/O发生了2次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。​1.并行与并发有什么区别?并行和并发...【详细内容】
2023-06-28  Java码农之路  今日头条  Tags:Java线程   点击:(23)  评论:(0)  加入收藏
Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响...【详细内容】
2023-06-25    尚硅谷教育  Tags:Java   点击:(10)  评论:(0)  加入收藏
译者 | 布加迪Java生态系统里面有形形色色、五花八门的开源项目,这些项目是为了满足各种可以想象到的需求而开发的。我们很容易错过其中一些出色的项目。下面介绍七个开源Jav...【详细内容】
2023-06-15    51CTO  Tags:Java   点击:(36)  评论:(0)  加入收藏
N+1问题:N+1问题是指在使用关系型数据库时,在获取一组对象及其关联对象时,产生额外的数据库查询的问题。其中N表示要获取的主对象的数量,而在获取每个主对象的关联对象时,会产生...【详细内容】
2023-06-14  MobotStone    Tags:Java   点击:(35)  评论:(0)  加入收藏
前言都说经典的就是好的,这句话放在Java的ThreadPoolExecutor上那是一点都没错,像现在数据库连接的池化实现,或者像Tomcat这种WEB服务器的线程管理,处处都有着ThreadPoolExecut...【详细内容】
2023-06-13  IT技术控  今日头条  Tags:ThreadPoolExecutor   点击:(42)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条