Java基础之stream流最新版,stream流的基本操作

news2024/11/26 12:21:35

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

文章目录

    • 1. Stream流是什么?
    • 2. Stream流的执行机制
      • 生成Stream流
      • 执行中间操作
      • 执行终止操作
    • 3.使用示例(中间操作)
      • 使用filter方法过滤所有红色苹果
      • 使用map方法,将所有苹果重量+10,并且输出对应的苹果的产地
      • sorted 排序方法
      • flatMap的使用
      • 去重,合并,跳过,截取(concat,distinct,skip,limit)
    • 终止操作
      • 聚合(max、min、count)
      • 统计(counting、averaging)
      • 遍历/匹配(foreach、find、match)
      • 归集collect(toList、toSet、toMap)
      • 分区、分组(partitioningBy、groupingBy)
      • 拼接(joining)

1. Stream流是什么?

JDK1.8 中增加了Stream流,Stream流是一种流式的处理数据的风格,也就是将要处理的数据当作流,在管道中进行传输,并在管道的每个节点对数据进行处理,如过滤、排序、转换等。

先来看一个Stream API的使用示例

       List<String> sourceList = Arrays.asList("1", "2", "", "12", "5");
        int sum = sourceList.stream()
                .filter(StringUtils::isNotBlank)
                .mapToInt(Integer::valueOf)
                .sum();
        System.out.println(sum);

这是个很简单的一个Stream使用例子,我们过滤掉空字符串后,转成int类型并对各个元素进行求和,这里有个三个操作:filter,mapToInt,sum。后面会详细介绍。

2. Stream流的执行机制

Stream内部通过流水线(Pipline)的方式来实现的,基本思路就是顺着流水线尽可能执行更多的操作,从而避免多次迭代。

Steam流操作有三个特性:

  1. Stream流不存储数据:而是按照特定的规则对数据进行计算,一般会输出结果。
  2. Stream流不改变源数据:通常情况下会产生一个新的集合或一个值。
  3. Stream流具有延迟执行特性:只有调用终端操作时,中间操作才会执行。

一个Stream流的使用主要包括三步:

Stream流执行机制

  1. 生成stream流:这就就是将输入的数据源转成Stream流,数据源主要是CollectionArray等集合数据。

  2. 执行中间操作:对数据进行处理

  3. 执行终止操作:返回最终的结果

    image-20230723160341372

生成Stream流

生成Stream流的方式有三种,分别是

List<String> sourceList = Arrays.asList("1", "2", "", "12", "5");
//1.创建stream串行流对象
sourceList.stream();
//2.创建可并行执行的stream流对象
sourceList.parallelStream();
//3.通过给定的一系列元素创建一个新的Stream串行流对象
Stream.of("12", "123", "14", "15");

执行中间操作

执行中间操作只是一种标记,只有结束操作才会触发实际计算。调用中间操作会返回一个新的流。 过滤,排序类的操作都是中间操作,中间操作可以有多个,中间操作分为无状态和有状态。

无状态:指元素的处理不受前面元素的影响。下面的方法均是无状态操作

方法说明
map()将已有元素转换为另一个对象类型,一对一逻辑
filter()按照条件过滤符号要求的元素
peek()对Stream流中的每个元素进行逐个遍历处理
unodered()返回一个无序的流,对于不关心顺序的数据处理和并行配合使用更佳。
mapToInt()将已有元素转成Int类型
mapToLong()将已有元素转成Long类型
mapToDouble()将已有元素转成Double类型
flatMap()将已有元素转换为另外对象类型,一对多逻辑
flatMapToInt()将已有元素转成Int类型

有状态:有状态的中间操作必须等所有元素处理之后才知道最终结果。比如排序是有状态的操作,在读取所有元素之前并不能确定排序结果。下面方法是有状态操作

方法说明
distinct()对stream中所有元素进行去重
sorted()结果排序
limit(n)仅保留集合前面指定个数的元素
skip(n)跳过集合前面指定个数的元素
concat()将两个流合并起来为1个新的流

执行终止操作

终止操作就是指定stream流的输出结果。

方法说明
count()元素个数
max()最大值
min()最小值
findFirst()第一个符合条件
findAny()任意一个符合条件
anyMatch()判断是否有符合条件元素
allMatch()是否所有元素都符合条件
noneMatch()是否所有元素都不符合
collect(Collectors进行指定)将流转换成指定类型
toArray()转换成数组
iterator()转换成iterator()对象
foreach()逐个遍历

3.使用示例(中间操作)

现在定义一个Apple类,此类有价格price,颜色color,重量weight,产地distinct 四个属性。

private static List<Apple> appleList = new ArrayList<>();

static {
    appleList.add(new Apple(10, "red", 12, "安徽"));
    appleList.add(new Apple(5, "red", 13, "江西"));
    appleList.add(new Apple(5, "blue", 10, "江西"));
    appleList.add(new Apple(40, "blue", 9, "河南"));
    appleList.add(new Apple(15, "blue", 11, "浙江"));
}
}
public class Apple {

    private Integer price;

    private String color;

    private Integer weight;

    private String district;

    public Apple(Integer price, String color, Integer weight, String district) {
        this.price = price;
        this.color = color;
        this.weight = weight;
        this.district = district;
    }
  省略getter和setter方法
}
  1. 使用filter方法过滤所有红色苹果

        //1.filter(过滤)筛选出所有颜色是红色的苹果
        List<Apple> red = appleList.stream().filter(apple -> apple.getColor().equals("red")).collect(Collectors.toList());
    
  2. 使用map方法,将所有苹果重量+10,并且输出对应的苹果的产地

        //2.map的使用,将所有苹果重量+10,并且输出对应的苹果的产地
    appleList.stream()
                    .map(apple -> {
                        apple.setWeight(apple.getWeight() + 10);
                        return apple;
                    }).map(Apple::getDistrict)
                    .collect(Collectors.toList());
    
  3. sorted 排序方法

    • sorted():自然排序,流中元素需实现Comparable接口
    • sorted(Comparator com):Comparator排序器自定义排序
 //3.sorted() 排序
        //按价格升序排序 自然排序
        System.out.println("按价格升序排序 自然排序");
        appleList.stream().sorted(Comparator.comparing(Apple::getPrice))
                .peek(System.out::println).collect(Collectors.toList());

        //按价格倒序排序 reversed()
        System.out.println("按价格倒序排序 reversed()");
        appleList.stream().sorted(Comparator.comparing(Apple::getPrice).reversed())
                .peek(System.out::println).collect(Collectors.toList());

        System.out.println("先按价格再按重量升序排序 thenComparing");
        //先按价格再按重量升序排序 thenComparing
        appleList.stream().sorted(Comparator.comparing(Apple::getPrice)
                        .thenComparing(Apple::getWeight))
                .peek(System.out::println)
                .collect(Collectors.toList());
        //自定义排序,先按价格再按重量(降序)
        System.out.println("自定义排序,先按价格再按年龄(降序)");
        appleList.stream().sorted((p1, p2) -> {
            if (p1.getPrice() == p2.getPrice()) {
                return p2.getWeight() - p1.getWeight();
            } else {
                return p2.getPrice() - p1.getPrice();
            }
        }).peek(System.out::println).collect(Collectors.toList());
  1. flatMap的使用

    • 当使用map()操作时,不是返回一个值,而是返回一个集合或者一个数组的时候,这时候就可以使用flatMap解决这个问题。就是扁平化将每个元素映射成另一个Stream对象。

    ,将两个字符数组合并成一个新的字符数组

      List<List<Integer>> lists = new ArrayList<>();
            List<Integer> list = new ArrayList<>();
            list.add(4444);
            list.add(33333);
            list.add(444444);
            lists.add(list);
            lists.stream().flatMap(Collection::stream).forEach(System.out::println);
    
            List<String> strings = Arrays.asList("m,k,l,a", "1,3,4,5");
            List<String> listNew = strings.stream().flatMap(s -> {
                //将每个元素转成一个新的stream
                String[] split = s.split(",");
                Stream<String> s2 = Arrays.stream(split);
                return s2;
            }).collect(Collectors.toList());
            System.out.println(listNew);
    
    
  2. 去重,合并,跳过,截取(concat,distinct,skip,limit)

    //创建两个流
    Stream<String> stream1 = Stream.of("1", "2", "", "12", "5");
    Stream<String> stream2 = Stream.of("3", "4", "5", "6");
    //concat:合并两个流    //distinct:去重
    List<String> lists1 = Stream.concat(stream1, stream2)
            .distinct().collect(Collectors.toList());
    //limit:限制从流中获取前n个数据
    List<String> collect = stream1.limit(3).collect(Collectors.toList());
    //skip:跳过前n个数据
    List<String> collect1 = stream1.skip(2).collect(Collectors.toList());
    

    终止操作

    1. 聚合(max、min、count)

      //取出价格最高的苹果
      appleList.stream().max(Comparator.comparing(Apple::getPrice)).get();
      //取出价格最低的苹果
      appleList.stream().min(Comparator.comparing(Apple::getPrice)).get();
      //统计元素个数
      appleList.stream().count();
      
    2. 统计(counting、averaging)

      Collectors提供了一系列用于数据统计的静态方法:

      • 计数:counting

      • 平均值:averagingInt、averagingLong、averagingDouble

      • 最值:maxBy、minBy

      • 求和:summingInt、summingLong、summingDouble

        //求平均重量
        Double avg = appleList.stream().collect(Collectors.averagingDouble(Apple::getWeight));
        //求和
        Integer sum = appleList.stream().collect(Collectors.summingInt(Apple::getWeight));
        
        //统计
        List<Integer> orgNums = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        IntSummaryStatistics statistics = orgNums.stream().mapToInt((x) -> x).summaryStatistics();
        System.out.println("列表中最大的数:" + statistics.getMax());
        System.out.println("列表中最小的数:" + statistics.getMin());
        System.out.println("所有数之和:" + statistics.getSum());
        System.out.println("平均数:" + statistics.getAverage());
        
    3. 遍历/匹配(foreach、find、match)

      //foreach
      appleList.stream().filter(apple -> apple.getColor().equals("blue"))
              .forEach(System.out::println);
      //匹配第一个颜色是blue的苹果
      appleList.stream().filter(apple -> apple.getColor().equals("blue"))
              .findFirst();
      //匹配任意一个颜色是blue的苹果
      appleList.stream().filter(apple -> apple.getColor().equals("blue"))
              .findAny();
      //是否包含符合特定条件的元素
      appleList.stream().anyMatch(apple -> apple.getColor().equals("blue"));
      
    4. 归集collect(toList、toSet、toMap)

      appleList.stream().map(Apple::getDistrict).collect(Collectors.toList());
      //调用toMap方法时,如果key重复可以如下处理
      Map<String, Apple> collect = appleList.stream().collect(Collectors.toMap(Apple::getDistrict, a->a,(a1,a2)->a1));
      //集合去重
      Set<Apple> collect1 = appleList.stream().collect(Collectors.toSet());
      
    5. 分区、分组(partitioningBy、groupingBy)

      • 分区:将stream按条件分为两个Map,比如水果按照价格是否高于12分出两部分。

      • 分组:将集合分为多个Map,比如水果按产地分组。有单级分组和多级分组。

        //- 分区:将stream按条件分为两个Map,比如水果按照价格是否高于12分出两部分。
        Map<Boolean, List<Apple>> collect = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getPrice() > 12));
        //- 分组:将集合分为多个Map,比如水果按产地分组。有单级分组和多级分组。
        Map<String, List<Apple>> collect1 = appleList.stream().collect(Collectors.groupingBy(apple -> apple.getDistrict()));
        
    6. 拼接(joining)

      List<String> list = Arrays.asList("1","2","3","4");
      //以空字符拼接,输出 1234
      String result= list.stream().collect(Collectors.joining());
      //以“-”符号拼接,输出1-2-3-4
      String result1= list.stream().collect(Collectors.joining("-"));
      System.out.println(result1);
      

多个参数

joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) 方法接受一个字符串序列作为拼接符,并在拼接完成后添加传递的前缀和后缀。假如我们传递的分隔符为 “-”,前缀为 “[” , 后缀为 “]” 。那么输出结果为 [1-2-3-4]

    List<String> arrayList = Arrays.asList("1","2","3","4");
        String collect = arrayList.stream().collect(Collectors.joining(",", "[", "]"));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 应用 cpu 过高故障排查

文章目录 一、前言二、测试代码 Test.java三、Linux 编译运行 Test.java 程序四、top 命令查看 cpu 使用情况五、查看进程下的线程详情 top -H -p 11748六、将线程 12240 的 pid 转为 16 进制 printf "0x%x\n" 12240七、jstack 查看进程的快照遗留 一、前言 前两天…

二十六章:Pyramid Vision Transformer ——金字塔视觉Transformer:一种无卷积的用于密集预测的多功能主干网络

0.摘要 虽然卷积神经网络&#xff08;CNN&#xff09;在计算机视觉领域取得了巨大成功&#xff0c;但本研究探讨了一种更简单、无卷积的骨干网络&#xff0c;适用于许多密集预测任务。与最近提出的专门用于图像分类的Vision Transformer&#xff08;ViT&#xff09;不同&#x…

无人机自主探索FUEL:代码阅读1--边界簇检测更新与视点生成

~/src/catkin_fuel_refactored/fuel_refactored/fuel_planner/bagbag中包含三个.sh文件&#xff0c;为rosbag指令&#xff0c;给出了录包指令以及有用话题信息 FIS 1、增量边界检测与聚类 路径&#xff1a;~/fuel_planner/active_perception/src/frontier_finder.cpp 主要函…

五、模型训练

目录 1. 线性模型1.1 Lasso 回归1.2 Ridge 回归 2. 树模型2.1 随机森林&#xff08;Random Forest&#xff0c;RF&#xff09;2.2 梯度提升树&#xff08;GBDT&#xff09;2.3 XGBoost2.4 LightGBM2.5 CatBoost2.6 模型深入对比 3. 神经网络3.1 多层感知机3.2 卷积神经网络3.3 …

Linux 下 nc 发送接收 udp、tcp数据

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注&#xff1a;这种方式只能发…

【Hive】Centos7安装单机版Hive

Hive依赖MySQL存储元数据信息&#xff0c;安装Hive前需要先安装MySQL 一、安装MySQL 下载mysql安装包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm2. 如果不是root用户需要先切换到root用户&#xff0c;安装第1步下载的rpm包 yum -y install …

MYSQL练习一答案

练习1答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、查询商品库存等于50的所有商品&#xff0c;显示商品编号&#xff0c;商 品名称&#xff0c;商品售价&#xff0c;商品库存。 SQL语句 select good_no,good…

数据结构07:查找[C++][B树Btree]

图源&#xff1a;文心一言 考研对于B树的要求重点在推理手算的部分&#xff0c;只参考王道论坛咸鱼老师的视频就可以了&#xff1b;若时间非常充裕的小伙伴&#xff0c;也可以往下滑了解一下代码~&#x1f95d;&#x1f95d; 备注&#xff1a; 这次的代码是从这里复制的&…

nodejs+vue+elementui汽车销售网站

前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 可以设置中间件来响应 HTTP 请求。 Express …

关于坏点问题的调试总结

1、问题背景&#xff1a; 前段时间调试一个项目&#xff0c;有发现在低照度场景下图上有很多明显的白点&#xff0c;如下图所示。以以往的调试经验来看这就是坏点&#xff0c;可以通过 ISP 中去坏点模块去将其抹掉&#xff0c;但这么多的明显坏点&#xff0c;通过去坏点模块去…

5.1.tensorRT基础(2)-正确导出onnx的介绍,使得onnx问题尽量少

目录 前言1. 正确导出ONNX总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 基础-正确导出 onnx 的介绍&#xff0…

【网络安全】DVWA靶场实战BurpSuite内网渗透

BurpSuite 内网渗透 一、 攻击模式介绍1.1 Sniper&#xff08;狙击手&#xff09;1.2 Battering ram&#xff08;攻城锤&#xff09;1.3 Pitchfork&#xff08;草叉&#xff09;1.4 Cluster bomb&#xff08;榴霰弹&#xff09; 二、 DVWA靶场搭建2.1 下载DVWA工程2.2 添加网站…

19 QListWidget控件

Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码&#xff1a; //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…

vue前端打包优化

建议&#xff0c;使用pnpn代替原生的npm 具体操作如下&#xff1a; pnpm安装&#xff0c;如果是linux&#xff0c;需要把npm和pnpm设置为环境变量## 安装pnpm npm install -g pnpm5.15.0 --registryhttps://registry.npm.taobao.org ## 设置淘宝镜像pnpm config set registry…

Vue3+vite实现组件上传npm并应用

场景&#xff1a;就是A项目的组件需要在B项目中使用 下面举例的是把a项目pagination分页组件上传到npm&#xff0c;在b项目使用 采坑日记&#xff1a;封装的组件一定要起name要不调用不成功 1.1 配置打包 1.1 首先在公用组件components文件夹下创建index.js文件&#xff0c…

JavaSwing+MySQL的小区物业管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88071096 JDK1.8、MySQL5.7 《数据库原理课程设计》课程设计任务书 题 目&#xff1a; 小区物业管理系统 学生姓名&#xff1a; xxxxxx 班 级&#xff1a; xx 级软件工程 x 班 学 号&#…

虚继承是如何解决二义性和数据的冗余的

我们知道面向对象的三大特性分别为封装,继承,多态。在继承中&#xff0c;我们知道一个类可以继承另一个类&#xff0c;这样的关系被叫做子类&#xff08;派生类&#xff09;继承父类&#xff08;基类&#xff09;&#xff0c;并且子类可以使用到父类的接口。但是在C中还被设计了…

ElasticSearch学习--数据聚合

介绍 数据聚合可以帮助我们对海量的数据进行统计分析&#xff0c;如果结合kibana&#xff0c;我们还能形成可视化的图形报表。自动补全可以根据用户输入的部分关键字去自动补全和提示。数据同步可以帮助我们解决es和mysql的数据一致性问题。集群可以帮助我们了解结构和不同节点…

Pytorch个人学习记录总结 08

目录 神经网络-搭建小实战和Sequential的使用 版本1——未用Sequential 版本2——用Sequential 神经网络-搭建小实战和Sequential的使用 torch.nn.Sequential的官方文档地址&#xff0c;模块将按照它们在构造函数中传递的顺序添加。代码实现的是下图&#xff1a; 版本1—…

BeanFactory容器的构建和使用示例

BeanFactory容器的实现流程&#xff1a; BeanFactory是Spring框架中的一部分&#xff0c;它提供了IoC&#xff08;控制反转&#xff09;的实现机制。下面是BeanFactory的IoC实现过程&#xff1a; 定义Bean定义&#xff1a;首先&#xff0c;我们需要在配置文件中定义Bean的定义…