Java中Stream详细使用教程

2023-11-15

1、java8中Stream流以及lambda的使用:

    stream可以将需要处理的集合元素看做流操作,是结合对象功能的一个增强;

    lambda表达式与stream结合使用,可以更好的对集合进行遍历、筛选、排序、聚合、分组;

    stream特性:不存储数据,只是对数据的记忆性运算;不会改变原数据源,但是会生成一个新的集合或其他值;

2、应用场景:
    2.1、测试类:

    @Data
    public class pre {
        private String name;
        private Integer age;
        private String sex;
    }

    2.2、初始化数据:

    public  List<pre> init() {
        List<pre> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            pre pre = new pre();
            if (i < 5) {
                pre.setName("a" + i);
                pre.setAge(i);
                pre.setSex("男");
            } else {
                pre.setName("a" + i);
                pre.setAge(i);
                pre.setSex("女");
            }
            list.add(pre);
        }
        return list;
    }

    2.3、遍历输出:


        方式一:stream

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    list.stream().forEach(System.out::println);

        方式二:forEach

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    list.forEach(System.out::println);

    2.4、获取数量:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    long count = list.stream().count();
    System.out.println(count);

    2.5、获取最大值:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    Integer max = list.stream().max(Integer::compareTo).get();
    System.out.println(max);

    2.6、获取最小值:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    Integer min = list.stream().min(Integer::compareTo).get();
    System.out.println(min);

    2.7、任意条件:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    boolean res = list.stream().anyMatch(i -> i > 5);
    System.out.println(res);

    2.8、全部条件:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    boolean res = list.stream().allMatch(i -> i % 2 == 0);
    System.out.println(res ? "全部都是偶数" : "不全是偶数");

    2.9、条件遍历输出:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    list.stream().filter(i -> i > 5).forEach(System.out::println);

    2.10、条件遍历输出第一条数据:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    Integer res = list.stream().filter(i -> i > 5).findFirst().get();
    System.out.println(res);

    2.11、条件筛选并放到新的容器中:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    List<Integer> res = list.stream().filter(i -> i > 5).collect(Collectors.toList());
    System.out.println(res);

    2.12、去重并输出:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    List<Integer> res = list.stream().distinct().collect(Collectors.toList());
    System.out.println(res);

    2.13、返回固定的长度:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    List<Integer> res = list.stream().limit(5).collect(Collectors.toList());
    System.out.println(res);

    2.14、去掉指定长度:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    List<Integer> res = list.stream().skip(5).collect(Collectors.toList());
    System.out.println(res);

    2.15、计算集合元素之和:


        方式一:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    Integer res = list.stream().reduce(0, (a, b) -> a + b);
    System.out.println(res);

        方式二:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    Integer res = list.stream().reduce(0, Integer::sum);
    System.out.println(res);

    2.16、集合中最大值:(这个以reduce的第一个参数和集合中作对比):

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 7);
    Integer res = list.stream().reduce(0, Integer::max);
    System.out.println(res);

    2.17、map映射-根据某个对象属性分组(利用2.1的对象来作为实体类,利用2.2初始测试数据):

    Map<String, List<pre>> res = list.stream().collect(Collectors.groupingBy(pre::getSex));
    System.out.println(res);

    2.18、map映射-将对象某个属性取出,并合并(利用2.1的对象来作为实体类,利用2.2初始测试数据):

    String res = list.stream().map(pre::getName).collect(Collectors.joining("--"));
    System.out.println(res);

    2.19、排序:

    List<Integer> list = Arrays.asList(1, 2, 3, 7, 5, 6, 6, 4);
    List<Integer> res = list.stream().sorted().collect(Collectors.toList());
    System.out.println(res);

    2.20、指定字段正序排序(利用2.1的对象来作为实体类,利用2.2初始测试数据):

     List<pre> res=list.stream().sorted(Comparator.comparing(pre::getAge)).collect(Collectors.toList());
     System.out.println(res);

    2.21、指定字段倒序排序(利用2.1的对象来作为实体类,利用2.2初始测试数据):

    List<pre> sortReverseRlt=list.stream().sorted(Comparator.comparing(pre::getAge).reversed()).collect(Collectors.toList());
    System.out.println(res);

2.22、多属性组合排序,指定字段1,指定字段2

        2.22.1、初始化数据

    public  List<pre> init() {
        List<pre> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
        pre pre = new pre();
        if (i < 5) {
            pre.setName("a" + i);
            pre.setAge(Integer.valueOf((int) (Math.random() * 100)));
            pre.setSex("男");
        } else {
            pre.setName("a" + i);
            pre.setAge(0);
            pre.setSex("女");
        }
            list.add(pre);
        }
        return list;
    }

        2.22.2、先按照age正序排序,再按照name正序排序(利用2.22.1初始化数据)

    List<pre> res=list.stream().sorted(Comparator.comparing(pre::getAge).thenComparing(pre ::getName)).collect(Collectors.toList());
    System.out.println(res);

        2.22.3、先按照age倒序排序,再按照name正序排序(利用2.22.1初始化数据)

    List<pre> res=list.stream().sorted(Comparator.comparing(pre::getAge).reversed().thenComparing(pre ::getName)).collect(Collectors.toList());
    System.out.println(res);

        2.22.4、先按照age正序排序,再按照name倒序排序(利用2.22.1初始化数据)

    List<pre> res=list.stream().sorted(Comparator.comparing(pre::getAge).thenComparing(pre ::getName).reversed()).collect(Collectors.toList());
    System.out.println(res);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中Stream详细使用教程 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 数据结构单向链表的C++实现

    本文的链表实现使用的是c 的类模板 构造节点类模板Node
  • 打卡格式

    2019 X xx Chen70
  • 还只看花书,西瓜书?一文告诉你如何正确学习深度学习,从理论到实战。

    如今春招已接近尾声 大家都知道今年就业形势整体不乐观 不仅应聘人数远远大于招聘岗位 而且面试难度加大 想拿到理想的offer更是难上加难 这段时间 很多人都在自我充电 我也经常在后台给读者解答很多深度学习相关问题 但大家问的更多的却是一些非
  • 如何查看文件的MD5值?

    MD5 什么是MD5 md5是一种信息摘要算法 是计算机广泛使用的杂凑算法之一 又译摘要算法 哈希算法 它可以从一个字符串或一个文件中按照一定的规则生成一个特殊的字符串 这个特殊的字符串就被称之为摘要 我理解就是从文件中摘一些信息片段加工而
  • R语言colorRampPalette函数-创建颜色梯度(渐变色)

    在绘热图时 需要将数值映射到不同的颜色上 这时就需要一系列的颜色梯度 colorRampPalette 函数支持自定义的创建一系列的颜色梯度 代码示例 gt colors lt colorRampPalette c blue red 5 g
  • windows加固-服务安全

    禁用TCP IP上的NetBIOS NETBIOS 在安装了TCP IP协议的同时 NetBIOS也会被作为默认设置安装到系统中 NetBIOS 协议所使用的端 是139端口 139 端 的开放意味硬盘可能会在网络中共享 网上黑客也可通Ne
  • 网络地址转换的类型及特点

    1 网络地址转换的类型及特点 NAT有三种类型 静态NAT StaticNAT 动态地址NAT PooledNAT 网络地址端口转换NAPT Port LevelNAT 静态NAT 指将内部网络的私有IP地址转换为公有IP地址 IP地址对是
  • On Distillation of Guided Diffusion Models

    本论文是解决什么问题的 无分类器引导扩散模型最近被证明在高分辨率图像生成方面非常有效 无分类器的引导扩散模型的缺点是 它们在推理时计算昂贵 原因是 因为它们需要评估两个扩散模型 一个类条件模型和一个无条件模型 数十到数百次 这篇论文提出的解
  • Linux Ubuntu安装教程

    1 创建新的虚拟机 2 选择 典型 点击 下一步 3 选择 稍后安装操作系统 点击 下一步 4 选择 Linux 版本选择 ubuntu 64位 点击 下一步 5 虚拟机名称输入 ubuntu 64位 点击 浏览 更改系统的安装位置 建议安
  • MySQL基础命令学习

    MySQL安装请看上一篇MySQL server安装记录 进入到数据库管理系统 DBMS C Windows System32 gt cd D mysql 8 0 22 winx64 bin D mysql 8 0 22 winx64 bi
  • Web自动化测试(5)-POM

    POM设计模式 目录 POM设计模式 1 简介 2 简单示例 3 UnitTest框架测试用例执行顺序 4 数据驱动 5 简单示例 1 简介 POM Page Object Model 设计模式又被称为页面对象模型 其核心思想是将web项目
  • 面向小白的最全Python可视化教程,超全的

    今天小编总结归纳了若干个常用的可视化图表 并且通过调用plotly matplotlib altair bokeh和seaborn等模块来分别绘制这些常用的可视化图表 最后无论是绘制可视化的代码 还是会指出来的结果都会通过调用streaml
  • Vue3全网最细介绍使用

    文章目录 一 Vue3介绍 二 Vue3项目创建 三 Setup 四 ref与reactive 五 setup context 六 计算属性 七 监听属性 八 Vue3生命周期 九 自定义hook函数 十 toRef 一 Vue3介绍 1
  • 思科命令配置总结

    Packet tracer 6 0 交换机命令配置 1 基本配置 Switch gt enable 用户模式 Switch configure terminal 特权模式 Switch config 全局模式 Switch config h
  • SDN-Mininet模拟多数据中心带宽实验

    一 实验目的 通过Mininet模拟搭建基于不同数据中心的网络拓扑 掌握多数据中心网络拓扑的构建 熟悉网络性能测试工具lperf 根据实验测试SDN网络的性能 通过程序生成真实网络流量 二 数据中心拓扑逻辑网络 存在线路冗余 多条链路可达
  • C语言提取(key,value)键值对

    include stdio h include stdlib h include string h 去除空格 int trim str char inBuf char outBuf int i 0 j strlen inBuf 1 int
  • nginx 之正则表达式(一)

    1 元字符 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线或汉字 s 匹配任意的空白符 d 匹配数字 b 匹配单词的开始或结束 匹配字符串的开始 匹配字符串的结束 2 重复 重复零次或多次 重复一次或多次 重复零次或一次 n 重复n
  • FTP被动模式连接被拒绝(FTP passive mode connection refused)

    I m creating an ftp client and I have a problem First I create a socket where I sent USER and PASS then PASV a receive I
  • 软件工程 第一章 软件工程概述

    1 什么是软件 软件是计算机系统中与硬件相互依存的另一部分 它是包括程序 数据及其相关文档的完整集合 程序 按事先设计的功能和性能需求执行的指令序列 数据 程序能正常操纵信息的数据结构 gt 软件的核心 文档 与程序开发 维护和使用有关的图
  • Java中Stream详细使用教程

    1 java8中Stream流以及lambda的使用 stream可以将需要处理的集合元素看做流操作 是结合对象功能的一个增强 lambda表达式与stream结合使用 可以更好的对集合进行遍历 筛选 排序 聚合 分组 stream特性 不