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

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

3天内不再提示

聊一聊Java中的Steam流

OSC开源社区 来源:OSCHINA 社区 2023-07-12 09:46 次阅读

1 引言

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

2 流简介

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

2.1 支持数据处理操作

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

2.2 源

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

List list = Arrays.asList(111,222,333);
Stream stream = list.stream();

一种是由数组创建流:

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

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

Stream stream = Stream.of(111, 222, 333);
Stream stream = Stream.of(111, 222, 333); 从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。
还有两种特殊的流:

空流:Stream.empty ()

无限流:Stream.genarate ()

2.3 元素序列

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

3 流的思想

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

public class Goods {
    private final String Name;
    private final Integer Volume;

    public Goods(String name, Integer volume) {
        Name = name;
        Volume = volume;
    }
    public String getName() {
        return Name;
    }
    public Integer getVolume() {
        return Volume;
    }
}

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

List goods = Arrays.asList(new Goods("土豆",10),
new Goods("冰箱",900),new Goods("办公椅",300));

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

List twofoods = goods.stream()//获取流
    .filter(goods1 -> goods1.getVolume()>200)//筛选商品体积大于200的
    .map(Goods::getName)//获取商品名称
    .limit(2)//筛选头两个商品
    .collect(Collectors.toList());//将结果保存在list中
这样看来,通过流来处理我们的特定需求,是不是比使用集合的迭代要方便很多呢?

4 流处理的特性

不存储数据

不会改变数据源

只可被使用一次

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

import org.springframework.util.Assert;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamCharacteristic {
    public void test1(){
        List list = Arrays.asList(1,2,2,5,6,9);
        list.stream().distinct();
        System.out.println(list.size());
    }
    public void test2(){
        List list = Arrays.asList("wms", "KA", "5.0");
        Stream 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。 在使用流的时候,主要需要三个要素:一个用来执行查询的数据源,用来形成一条流的流水线的中间操作链,一个能够执行流水线并能生成结果的终端操作。 下图展示了流的整个操作流程:

de254840-1fdc-11ee-962d-dac502259ad0.png

6 总结

流是从支持数据处理操作的源生成的元素序列

流的思想类似于生产中的流水线

流不存储数据,不改变数据源,只能被改变一次

流的操作主要分为中间操作和终端操作两大类





审核编辑:刘清

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

    关注

    68

    文章

    18954

    浏览量

    227611
  • 存储器
    +关注

    关注

    38

    文章

    7378

    浏览量

    163184
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    20034

原文标题:聊一聊Java中的Steam流

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    从焊接角度,设计PCB的5个建议

    完成个电路板,需要PCB工程师、焊接工艺、焊接工人等诸多环节的把控。今天通过定位孔、MARK点、留边、焊盘过孔、辅助工具这五个方面从画板的角度跟大家PCB设计。
    的头像 发表于 02-06 10:31 1903次阅读
    从焊接角度<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>,设计PCB的5个建议

    消息队列技术选型的7种消息场景

    我们在做消息队列的技术选型时,往往会结合业务场景进行考虑。今天来消息队列可能会用到的 7 种消息场景。
    的头像 发表于 12-09 17:50 1192次阅读
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>消息队列技术选型的7种消息场景

    AltiumFill,Polygon Pour,Plane的区别和用法

    Fill会造成短路,为什么还用它呢?来AltiumFill,Polygon Pour,Plane的区别和用法
    发表于 04-25 06:29

    stm32的低功耗调试

    前言:物联网的大部分设备都是电池供电的,设备本身低功耗对延长设备使用至关重要,今天就实际调试总结stm32的低功耗调试。1、stm32在运行状态下的功耗上图截图自stm32l15x手册
    发表于 08-11 08:18

    7系列FPGA的供电部分

    前几篇咱们说了FPGA内部逻辑,本篇咱们再聊7系列FPGA的供电部分。首先咱们说spartan7系列,通常咱们需要使用以下电源轨:1,VCCINTFPGA内部核心电压。其不损坏FPGA器件的范围
    发表于 11-11 09:27

    平衡小车代码的实现

    前言今天代码,只有直立功能的代码。代码总体思路给定个目标值,单片机通过IIC和mpu6050通信,得知数据后,根据角度环计算出个P
    发表于 01-14 08:29

    FPGA的片内资源相关知识

    大家好,到了每日学习的时间了。今天我们来FPGA的片内资源相关知识。 主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、DCM和DSP)的硬核
    的头像 发表于 05-25 14:11 8835次阅读
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>FPGA的片内资源相关知识

    IIC总线设计

    大家好,又到了每日学习的时间了,今天咱们来 IIC 总线设计。 、概述: IIC 是Inter-Integrated Circuit的缩写,发音为eye-squared cee
    的头像 发表于 06-22 10:32 9198次阅读

    小米米2月19日停止服务 米宣布关闭服务器

    v8.8.70 及以上版本支持批量导出。 2010年12月10日,反应迅速的小米仅仅用了不到2个月的时间,发布了中国第款模仿kik的产品——米。Kik是款基于手机通信录的社交软件,用户可以免费短信聊天。 2012年5月,
    的头像 发表于 01-20 05:43 6573次阅读

    复活了 能维持多久?

    2021年2月19日,米宣布停服,2021年2月26日,米重新上线。不过这次,米却是以全新的面貌与大家相见。
    发表于 03-08 16:32 1119次阅读

    FPGA的彩色转灰度的算法

    大家好,又到了每日学习的时间了,今天我们来FPGA学习可以遇到的些算法,今天就
    的头像 发表于 04-15 15:47 1875次阅读

    【职场杂谈】与嵌入式物联网架构师几个话题

    【职场杂谈】与嵌入式物联网架构师几个话题
    的头像 发表于 08-23 09:19 1225次阅读
    【职场杂谈】与嵌入式物联网架构师<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>几个话题

    华为云弹性公网IP的那些事儿

    华为云弹性公网IP的那些事儿 如今,企业上云已成为热门话题,云可以驱动流程创新和业务创新,成为企业新的利润增长点,被看成是企业实现数字化转型的必经之路。弹性公网IP作为种网络基
    的头像 发表于 11-21 15:20 812次阅读
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>华为云弹性公网IP的那些事儿

    简单DPT技术-double pattern technology

    今天想来简单DPT技术-double pattern technology,也就是双层掩模版技术,在目前先进工艺下,这项技术已经应用的很普遍了。
    的头像 发表于 12-05 14:26 1154次阅读

    芯片设计的NDR是什么?

    今天突然想route相关的问题,讲讲NDR是什么,我也梳理总结下我对NDR的认识。
    的头像 发表于 12-06 15:14 1420次阅读