stream()转map转list、distinct()去重、判断空值、sorted排序正序多字段排序

2023-11-18

package demo.io;

import demo.api.JavaBean.Student;
import org.junit.platform.commons.util.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: donghaotian
 * @Date: 2022-04-11 16:35
 */
public class stream流操作 {
    public static void main(String[] args) {
        Student student = new Student();
        student.setId(1);
        student.setName("dht");
        Student student2 = new Student();
        student2.setId(2);
        student2.setName("dht2");
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student2);

        //获取list<实体类>其中一个属性(可指定类型)
        List<Object> nameList = studentList.stream().map(Student::getName).collect(Collectors.toList());
        System.out.println("nameList = " + nameList);
        Object o = nameList.stream().reduce((x, y) -> x.toString() + " + " + y.toString()).get();
        System.out.println("list所有值相加 = " + o);
        //判断list<String>是否包含空字符串
        boolean b = nameList.stream().allMatch(name -> StringUtils.isBlank(name.toString()));
        System.out.println(b);
        //获取list<实体类>其中两个属性为map集合
        Map<Integer, String> map = studentList.stream().collect(Collectors.toMap(Student::getId, Student::getName));
        System.out.println("map = " + map);
        //获取list<实体类>其中两个属性为map集合,若id重复则获取后者
        Student student3 = new Student(2, "dht3");
        studentList.add(student3);
        Map<Integer, String> map2 = studentList.stream().collect(Collectors.toMap(Student::getId, Student::getName,
                (String key1, String key2) -> key2));
        System.out.println("若id重复则获取后者:map2 = " + map2);
        //获取list<实体类>其中两个属性为map集合,若id重复则获取后者
        Map<Integer, String> map3 = studentList.stream().collect(Collectors.toMap(Student::getId, Student::getName, (key1, key2) -> key1 + "," + key2));
        System.out.println("若id重复则获取两者:map3 = " + map3);
        //重要:重复时将重复key的数据组成集合
        // toMap()的第一个参数就是用来生成key值的,第二个参数就是用来生成value值的。
        // 第三个参数用在key值冲突的情况下:如果新元素产生的key在Map中已经出现过了,第三个参数就会定义解决的办法。
        Map<Integer, List<String>> map4 = studentList.stream().collect(Collectors.toMap(Student::getId,
                p -> {
                    List<String> getNameList = new ArrayList<>();
                    getNameList.add(p.getName());
                    return getNameList;
                },
                (List<String> value1, List<String> value2) -> {
                    value1.addAll(value2);
                    return value1;
                }
        ));
        System.out.println("重要:重复时将重复key的数据组成集合" + map4);

        //获取list<实体类>其中一个属性(有空值)
        Student student4 = new Student(4, null);
        // studentList.add(student4);
        List<Object> nameList2 = studentList.stream().map(sdsTest -> sdsTest.getName() == null ? "0" : sdsTest.getName()).collect(Collectors.toList());
        System.out.println("获取list<实体类>其中一个属性(有空值)nameList2 = " + nameList2);

        //去重(需使用@Data重写hashCode和equals)
        Student student5 = new Student(2, "dht3");
        studentList.add(student5);
        List<Integer> nameListNoDistinct = studentList.stream().map(Student::getId).collect(Collectors.toList());
        List<Integer> nameListDistinct = studentList.stream().distinct().map(Student::getId).collect(Collectors.toList());
        System.out.println("未去重 = " + nameListNoDistinct);
        System.out.println("distinct()去重 = " + nameListDistinct);

        //去重实体类的指定属性
        List<Integer> ids = new ArrayList<>();//用于临时存储TestValue的Name
        List<Student> studentDistinctId = studentList.stream().filter(
                v -> {
                    if (ids.contains(v.getId())) {
                        return false;
                    } else {
                        ids.add(v.getId());
                        return true;
                    }
                }).collect(Collectors.toList());
        System.out.println("去重实体类的指定属性id : " + studentDistinctId);

        //排序 加reversed()倒序
        List<Student> idListSorted = studentList.stream().sorted(Comparator.comparing(Student::getId, Comparator.nullsFirst(Integer::compareTo))//nullsFirst:空值放前面
                .reversed()//倒序(注意倒序后空值在后面)
                .thenComparing(Student::getName)//第二个排序字段正序
                .reversed()//倒序
        ).collect(Collectors.toList());
        System.out.println("排序 = " + idListSorted);

        //根据字段分组
        Map<String, List<Student>> map1 = studentList.stream().collect(Collectors.groupingBy(Student::getName));
        System.out.println("map1 = " + map1);

        System.out.println("studentList = " + studentList);

        //根据实体类某字段去重
       List<Student> studentDistinctByNameArrayList = studentList.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList::new));
        System.out.println("studentDistinctByNameArrayList = " + studentDistinctByNameArrayList);

        //求和
        System.out.println("求和:" + studentList.stream().mapToInt(Student::getId).sum());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stream()转map转list、distinct()去重、判断空值、sorted排序正序多字段排序 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • zsh: bad CPU type in executable: /usr/local/bin/git

    MAC安装nvm的时候报错zsh bad CPU type in executable usr local bin git 查找原因 通过where git可以看到有2个路径 一个 usr bin git一个 usr bin local g
  • 虚拟机--无法连接网络

    情况 运行命令 ifconfig 没有看到 ens33 网络 命令 ifconfig a 可以看到 ens33 其他 关闭防火墙 systemctl stop firewalld 查看状态 systemctl status firewall
  • HIT软件构造《设计模式》部分总结

    创造模式 创造模式关心的是对象类创造的过程应该遵循的原则 里氏替换原则 继承必须确保超类所拥有的性质在子类中仍然成立 里氏替换原则 Liskov Substitution Principle LSP 是面向对象的设计原则 通俗地讲 它指出了
  • 我放弃了VMware

    文章目录 哈哈哈 不得不说 有点儿标题狗的意思 不去写新闻真的屈才了 正如标题所说 我弃用了VMware 但是我使用上了WSL2 相对来说 wsl2使我不怎么担心我16G的内存不够用 其实 wsl也是虚拟技术的一种 但是相比VMware v
  • net start mysql80拒绝访问

    文章目录 1 问题描述 2 一次性解决方案 3 永久性解决方案 1 问题描述 问题描述 在我们使用dos窗口进行操作的时候 无论使用的是net start stop mysql80都会发生拒绝访问的问题 通常这个问题的发生都是因为大家把my
  • 国产信创服务器如何进行安全可靠的文件传输?

    信创 即信息技术应用创新 2018年以来 受 华为 中兴事件 影响 国家将信创产业纳入国家战略 并提出了 2 8 n 发展体系 从产业链角度 信创产业生态体系较为庞大 主要包括基础硬件 基础软件 应用软件 信息安全4部分构成 其中芯片 服务
  • ChatGPT知多少?小白扫盲,通俗易懂

    一 ChatGPT到底是什么 ChatGPT是由OpenAI 发布的自然语言模型 它的英文全称是 Chat Generative Pre trained Transformer 直译过来就是作为聊天使用的生成式预训练转换器 其中 Chat代
  • 此时不应有java_Java出现"此时不应有......."的错误

    今晚在安装weblogic的时候 双击运行startWebLogic cmd dos窗口一闪而过 随后将 startWebLogic cmd 拖进cmd窗口运行 显示 此时不应有 tools jar 然后我把环境变量CLASSPATH中的
  • H265视频转码H264视频

    LiveMedia视频平台提供H5网页web前端无插件视频码流 但目前主流浏览器和播放器都只支持H264的码流 但是随着编码技术的迭代 目前H265编码的视频已在安防行业得到了广泛的使用 平台仅支持H264需要客户修改前端的视频编码 这样会
  • html动态标题设计源码

    html酷炫动态发光标题 效果图如下 index html
  • 【spring boot logback】日志颜色渲染,使用logback-spring.xml自定义的配置文件后,日志没有颜色了...

    接着spring boot日志logback解析之后 发现使用logback spring xml自定义的配置文件后 日志没有颜色了 怎么办 官网处理日志链接 https logback qos ch manual layouts html
  • BeautifulSoup库

    BeautifulSoup安装 1 以管理员运行cmd 2 输入 pip install beautifulsoup4 BeautifulSoup库的基本元素 BeautifulSoup库的理解 BeautifulSoup库是解析 遍历 维
  • 【分享干货】Mac系统IDEA 安装教程

    IEEA 安装 什么是idea idea 介绍 idea官网 https www jetbrains com 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img Pynu6DTk 1654592966880 User
  • Java封装性(包含this关键字,构造器等)

    目录 一 封装性的含义 二 封装性的作用 三 封装性的体现 3 1 四种权限修饰符的介绍 3 2 分装性具体的实现 四 构造器的解释 4 1 构造器的作用 4 2 注意事项 4 3 构造器的举例说明 五 this关键字的使用 5 1 thi
  • jdk8的十大新特性

    了解jdk8的新特性首先要了解jdk7的新特新都有哪些方面增强 1 jdk语法上 1 1二进制变量的表示 支持将整数类型用二进制来表示 用Ob开头 1 2Switch语句支持String类型 1 3Try with resource语句 注
  • 欢欢喜喜: 在lenovo网站购T61的经历

    1月3日 在lenovo网站购T61的经历 一直以来对IBM的小黑情有独钟 不过考虑国内昂贵的价格和需求的迫切性不高 所以 也只是观望中 上次去米果的时候 看到lenovo网上卖的T61笔记本 标的价格比平时都低300 于是动了心 开始在
  • 使用 PullToRefresh 的总结

    前言 关于下拉刷新 上拉加载的框架现在有很多 这里奉上别人收集的一些框架 下拉刷新框架收集 但是笔者一直还在使用 PullToRefresh 个人觉得 PullToRefresh 使用起来还是比较简洁方便的 关于 PullToRefresh
  • unity-ugui-eventsystem

    EventSystem对象的说明 当我们在场景中创建任一UI对象后 Hierarchy面板中都可以看到系统自动创建了对象EventSystem 可以看到该对象下有三个组件 EventSystem StandaloneInputModule
  • 七天引爆社交新零售(助你提高十倍业绩)——前言

    2019年对于中小企业主 创业者 实体店主最大的机遇就是社交新零售 为什么这么说呢 随着日益上涨房租成本 人工成本的上升 实体生意利润空间越来越小了 而传统线上电商企业流量广告费也越来越贵了 大家一直在探索有没有一种低成本高收益的销售方式出
  • stream()转map转list、distinct()去重、判断空值、sorted排序正序多字段排序

    package demo io import demo api JavaBean Student import org junit platform commons util StringUtils import java util imp