【JDK8新特性之Stream流-Stream结果收集案例实操】

news2025/7/8 9:53:12

一.JDK8新特性之Stream流-Stream结果收集以及案例实操

在这里插入图片描述

二.Stream结果收集(collect函数)-实例实操

2.1 结果收集到集合中

	/**
     * Stream将结果收集到集合中以及具体的实现 collect
     */
    @Test
    public void test01(){
        // 收集到List中   接口
        List<Integer> list = Stream.of(1, 2, 3,4)
                .collect(Collectors.toList());
        System.out.println(list);
        // 收集到 Set集合中  接口
        Set<Integer> set = Stream.of(1, 2, 3,4)
                .collect(Collectors.toSet());
        System.out.println(set);

        // 如果需要获取的类型为具体的实现,ArrayList HashSet
        ArrayList<Integer> list1 = Stream.of(1, 2, 3,4)
                //.collect(Collectors.toCollection(() -> new ArrayList<>()));
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(list1);
        //如果需要获取的类型为具体的实现,HashSet
        HashSet<Integer> set1 = Stream.of(1, 2, 3,4)
                .collect(Collectors.toCollection(HashSet::new));
        System.out.println(set1);
    }

输出结果

在这里插入图片描述

2.2 结果收集到数组中

Stream中提供了toArray方法来将结果放到一个数组中,返回值类型是Object[],如果我们要指定返回的类型,那么可以使用另一个重载的toArray(IntFunction f)方法

/**
     * Stream结果收集到数组中
     */
    @Test
    public void test02(){
        // 返回的数组中的元素是 Object类型
        Object[] objects = Stream.of("s1", "s2", "s3").toArray(); 
        System.out.println(Arrays.toString(objects));
        // 如果我们需要指定返回的数组中的元素类型
        // 需要我们在toArray()方法中传入数组类型
        String[] strings = Stream.of("s1", "s2", "s3")
                .toArray(String[]::new);
        System.out.println(Arrays.toString(strings));
    }

结果展示:
在这里插入图片描述

2.3 对流中的数据做聚合计算

​ 当我们使用Stream流处理数据后,可以像数据库的聚合函数一样对某个字段进行操作,比如获得最大值,最小值,求和,平均值,统计数量。

/**
     * Stream流中数据的聚合计算(最大值、最小值、求和、求平均值、满足条件的结果个数)
     */
    @Test
    public void test03(){
        // 获取员工薪资的最大值
        Optional<Person> maxSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.maxBy((p1, p2) -> p1.getSalary() - p2.getSalary()));
        System.out.println("最多薪资:" + maxSalary.get());
        // 获取员工薪资的最小值
        Optional<Person> minSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.minBy((p1, p2) -> p1.getSalary() - p2.getSalary()));
        System.out.println("最少薪资:" + minSalary.get());
        // 求所有人员工薪资之和
        Integer sumSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.summingInt(Person::getSalary));
        System.out.println("薪资总和:" + sumSalary);
        // 员工薪资的平均值
        Double avgSalary = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.averagingInt(Person::getSalary));
        System.out.println("薪资的平均值:" + avgSalary);
        // 员工薪资统计数量
        Long count = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).filter(p->p.getSalary() > 4000)
                .collect(Collectors.counting());
        System.out.println("满足条件的记录数:" + count);
    }

结果展示
在这里插入图片描述

2.4 对流中数据做分组操作

当我们使用Stream流处理数据后,可以根据某个属性将数据分组

/**
     * 分组计算:按照我们是收入进行分组,分组的高收入组和低收入组
     */
    @Test
    public void test04(){
        Map<String, List<Person>> map = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.groupingBy(p -> p.getSalary() >= 4000 ? "高收入" : "低收入"));
        map.forEach((k,v)-> System.out.println("k=" + k +"\t"+ "v=" + v));
    }

输出结果:

在这里插入图片描述

多级分组: 先根据name分组然后根据年龄分组

/**
     * 分组计算--多级分组(先按照姓名分组,然后再按照年龄分组)
     */
    @Test
    public void test05(){
        Map<String,Map<Object,List<Person>>> map =  Stream.of(
                new Person("张三", 18, 175)
                , new Person("李四", 22, 177)
                , new Person("张三", 14, 165)
                , new Person("李四", 15, 166)
                , new Person("张三", 19, 182)
        ).collect(Collectors.groupingBy(
                Person::getName
                ,Collectors.groupingBy(p->p.getAge()>=18?"成年":"未成年"
                )
        ));
        map.forEach((k,v)->{
            System.out.println(k);
            v.forEach((k1,v1)->{
                System.out.println("\t"+k1 + "=" + v1);
            });
        });
    }

输出结果:
在这里插入图片描述

2.5 对流中的数据做分区操作

Collectors.partitioningBy会根据值是否为true,把集合中的数据分割为两个列表,一个true列表,一个false列表

/**
     * 分区操作
     */
    @Test
    public void test06(){
        Map<Boolean, List<Person>> map = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).collect(Collectors.partitioningBy(p -> p.getSalary() > 6000));
        map.forEach((k,v)-> System.out.println(k+"\t" + v));
    }

输出结果:
在这里插入图片描述

2.6 对流中的数据做拼接

Collectors.joining会根据指定的连接符,将所有的元素连接成一个字符串

/**
     * 对流中的数据做拼接操作(对应着三种重载方法)
     */
    @Test
    public void test07(){
        // 第一种拼接:直接拼接
        String s1 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining());
        System.out.println(s1);
        // 第二种拼接:每个拼接中加"_"来进行连接
        String s2 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining("_"));
        System.out.println(s2);
        // 第三种拼接:前后拼接加上"_",拼接的开始加上"--->",结束加上"<---"
        String s3 = Stream.of(
                new Person("Jack", 3445)
                , new Person("Tom", 4324)
                , new Person("Meisi", 14353)
                , new Person("Coroergo", 13425)
        ).map(Person::getName)
                .collect(Collectors.joining("_", "--->", "<---"));
        System.out.println(s3);
    }

结果展示:
在这里插入图片描述

三.总结

人活着就在不停的做选择题,无论你做出了什么样的选择,我觉得都是你深思熟虑过后的答案,结果固然重要,但过程同样精彩,我是硕风和炜,我们下篇文章见哦!

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

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

相关文章

码住!新手容易上手的5个tiktok数据分析网站

当下短视频已经称霸了各大内容平台&#xff0c;越来越多的创作者进入到短视频赛道&#xff0c;为了更好地运营自己的内容平台&#xff0c;数据分析是必不可少的。很多人都入局了tiktok&#xff0c;对于商家或者博主红人来说&#xff0c;这是比较新平台&#xff0c;希望能在这个…

Spring Cloud Gateway的使用

Spring Cloud Gateway网关Spring Cloud Gateway三大核心概念Route(路由)Predicate(断言)Filter(过滤)开始使用动态路由配置路由断言过滤器实现TokenIP验证拦截Spring Cloud Gateway 网关&#xff1a;微服务中最边缘的服务&#xff0c;用来做用户和微服务的桥梁 没有网关❓&…

Python使用VTK对容积超声图像进行体绘制(三维重建)

目录VTK简介什么是体绘制&#xff1f;体绘制效果图流程CodeQ&AReferenceVTK简介 VTK&#xff08;Visualization Toolkit&#xff09;是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具&#xff0c;可以让用户创建和处理复杂的3D图形和数据可视…

论文投稿指南——中文核心期刊推荐(音乐)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

超纯水制备,MB-106UP抛光树脂的技术解析

超纯水&#xff08;Ultrapure water&#xff09;又称UP水&#xff0c;是指电阻率达到18 MΩ*cm&#xff08;25℃&#xff09;的水。这种水中除了水分子外&#xff0c;几乎没有什么杂质&#xff0c;更没有细菌、病毒、含氯二噁英等有机物&#xff0c;当然也没有人体所需的矿物质…

低代码是什么意思?企业为什么要用低代码平台?

低代码是什么意思&#xff1f;企业为什么要用低代码平台&#xff1f; 这两个问题似乎困扰了很多人&#xff0c;总有粉丝跟小简抱怨&#xff0c;一天到晚念叨低代码&#xff0c;倒是来个人解释清楚啊&#xff01; 来了&#xff0c;这次一文让你全明白。 先解释这几个名词&…

mysql5.7.39数据库服务搭建(win10)

mysql下载下载地址&#xff1a;https://downloads.mysql.com/archives/community如上图&#xff0c;选择了mysql 5.7.39版本&#xff0c;64位Windows操作系统&#xff1b;然后下载ZIP Archive格式的安装文件&#xff0c;点击“Download” 按钮即可。下载好后&#xff0c;进行解…

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…

win11右键新建菜单添加选项

需要操作 2 处注册表&#xff0c; 以下以在右键新建菜单中添加 .html 为例 在主键 HKEY_CLASSES_ROOT 中&#xff0c;搜索 .html 找到后 &#xff0c;右键点击它&#xff0c;选 新建 ->项&#xff0c; 在这里插入图片描述 项目名字是&#xff1a;ShellNew 新建后&#x…

【Linux学习笔记】4.Linux 文件基本属性及文件与目录管理

前言 本章介绍Linux的文件基本属性和文件与目录管理。 Linux 文件基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录…

Linux命令及CPU占用过高的定位分析思路

一、vim命令不要使用vim打开大文件&#xff0c;vim会一次性读取所有内容到内存&#xff0c;容易造成宿主机内存溢出。 打开文件前&#xff0c;可以使用du -h命令查看文件大小。一般&#xff0c;100MB以下为宜。1、普通模式j 向下30j 向下移动30行k 向上h 向左l 向右0 到行首^ 到…

3.15版本poi导致FileMagic文件找不到问题解决过程记录

maven中的dependencies和dependencyManagement的区别_shenzhou_yh的博客-CSDN博客 maven 中 dependencies 与 dependencyManagement 的区别_Jaemon的博客-CSDN博客_snapshot dependencies和artifact dependencies的区别 com.alibaba.excel.exception.ExcelAnalysisException: …

ubuntu/linux系统知识(37)systemd管理临时文件的方法systemd-tmpfiles

1、systemd-tmpfiles Linux产生大量的临时文件和目录&#xff0c;例如/tmp、/run 。systemd提供了一个结构化的可配置方法来管理临时文件和目录&#xff0c;即systemd-tmpfiles工具和配套的几个服务&#xff0c;以实现创建、删除和管理临时文件。 systemd创建了几个调用syste…

React(一):初识React、类组件、jsx的基础语法

React&#xff08;一&#xff09;一、初识React1.简单介绍2.React的三个依赖3.Hello React案例二、类组件1.定义类组件并渲染2.绑定事件函数&#xff08;奇怪的this问题&#xff09;3.数组形式数据的展示&#xff08;电影案例&#xff09;4.计数器案例三、jsx语法详解1.jsx的书…

【GUI】用于电动助力车性能分析的GUI(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

202302-第四周资讯

山川软件愿为您提供最优质的服务。 您的每一个疑问都会被认真对待&#xff0c;您的每一个建议都将都会仔细思考。 我们希望人人都能分析大数据&#xff0c;人人都能搭建应用。 因此我们将不断完善我们的DEMO、文档、以及视频&#xff0c;期望能在最大程度上快速帮助用户快速…

最新OpenMVG编译安装与逐命令运行增量式和全局式SfM教程

openmvg是一个轻便的可以逐步运行的SfM开源库&#xff0c;它同时实现了增量式和全局式两种算法。 说明文档地址&#xff1a;https://openmvg.readthedocs.io/en/latest/ github主页地址&#xff1a;https://github.com/openMVG/openMVG 1 编译安装 openmvg的安装比较简单&…

【centos7下部署mongodb】

一.安装环境 CentOS7MongoDB4.0.13正式版。 二.下载MongoDB 1.1 官网下载地址&#xff1a;https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.13.tgz 1.2 将压缩包通过xftp上传到服务器/opt目录&#xff0c;然后解压、改名 三. 配置环境变量及配置文件 3.1配置系…

8000+字,就说一个字Volatile

简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制&#xff1a;同步块&#xff08;或方法&#xff09;和 volatile 变量&#xff0c;相比于synchronized&#xff08;synchronized通常称为重量级锁&#xff09;&#xff0c;volatile更轻量级&…

2023最新版网络安全保姆级指南,手把手带你从零基础进阶渗透攻防工程师

前言 一份网络攻防渗透测试的学习路线&#xff0c;不藏私了&#xff01; 1、学习编程语言(phpmysqljshtml) 原因&#xff1a; phpmysql可以帮助你快速的理解B/S架构是怎样运行的&#xff0c;只有理解了他的运行原理才能够真正的找到问题/漏洞所在。所以对于国内那些上来就说…