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

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

3天内不再提示

Java 8 Stream之collect()的奇技淫巧

Android编程精选 来源:Android编程精选 作者:Android编程精选 2022-11-22 15:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

本身我是一个比较偏向少使用Stream的人,因为调试比较不方便。

但是, 不得不说,stream确实会给我们编码带来便捷。

所以还是忍不住想分享一些奇技淫巧。

正文

Stream流 其实操作分三大块 :

  • 创建
  • 处理
  • 收集

我今天想分享的是 收集 这part的玩法。

3e15ee36-6998-11ed-8abf-dac502259ad0.png

OK,开始结合代码示例一起玩下:

lombok依赖引入,代码简洁一点:

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.20version>
<scope>compilescope>
dependency>

准备一个UserDTO.java

/**
*@Author:JCccc
*@Description:
*/
@Data
publicclassUserDTO{

/**
*姓名
*/
privateStringname;
/**
*年龄
*/
privateIntegerage;
/**
*性别
*/
privateStringsex;
/**
*是否有方向
*/
privateBooleanhasOrientation;

}

准备一个模拟获取List的函数:

privatestaticListgetUserList(){
UserDTOuserDTO=newUserDTO();
userDTO.setName("小冬");
userDTO.setAge(18);
userDTO.setSex("男");
userDTO.setHasOrientation(false);
UserDTOuserDTO2=newUserDTO();
userDTO2.setName("小秋");
userDTO2.setAge(30);
userDTO2.setSex("男");
userDTO2.setHasOrientation(true);
UserDTOuserDTO3=newUserDTO();
userDTO3.setName("春");
userDTO3.setAge(18);
userDTO3.setSex("女");
userDTO3.setHasOrientation(true);
ListuserList=newArrayList<>();
userList.add(userDTO);
userList.add(userDTO2);
userList.add(userDTO3);
returnuserList;
}

第一个小玩法

将集合通过Stream.collect() 转换成其他集合/数组:

现在拿List 做例子

转成 HashSet

ListuserList=getUserList();

StreamusersStream=userList.stream();

HashSetusersHashSet=usersStream.collect(Collectors.toCollection(HashSet::new));

转成 Set usersSet

ListuserList=getUserList();

StreamusersStream=userList.stream();

SetusersSet=usersStream.collect(Collectors.toSet());

转成 ArrayList

ListuserList=getUserList();

StreamusersStream=userList.stream();

ArrayListusersArrayList=usersStream.collect(Collectors.toCollection(ArrayList::new));

转成 Object[] objects

ListuserList=getUserList();

StreamusersStream=userList.stream();

Object[]objects=usersStream.toArray();

转成 UserDTO[] users

ListuserList=getUserList();

StreamusersStream=userList.stream();

UserDTO[]users=usersStream.toArray(UserDTO[]::new);
for(UserDTOuser:users){
System.out.println(user.toString());
}

第二个小玩法

聚合(求和、最小、最大、平均值、分组)

找出年龄最大:
stream.max()

写法 1:

ListuserList=getUserList();
StreamusersStream=userList.stream();
OptionalmaxUserOptional=
usersStream.max((s1,s2)->s1.getAge()-s2.getAge());
if(maxUserOptional.isPresent()){
UserDTOmasUser=maxUserOptional.get();
System.out.println(masUser.toString());
}

写法2:

ListuserList=getUserList();StreamusersStream=userList.stream();
OptionalmaxUserOptionalNew=usersStream.max(Comparator.comparingInt(UserDTO::getAge));
if(maxUserOptionalNew.isPresent()){
UserDTOmasUser=maxUserOptionalNew.get();
System.out.println(masUser.toString());
}

效果:

3e23fde6-6998-11ed-8abf-dac502259ad0.png

输出:

UserDTO(name=小秋,age=30,sex=男,hasOrientation=true)
找出年龄最小:
stream.min()

写法 1:

OptionalminUserOptional=usersStream.min(Comparator.comparingInt(UserDTO::getAge));
if(minUserOptional.isPresent()){
UserDTOminUser=minUserOptional.get();
System.out.println(minUser.toString());
}

写法2:

Optionalmin=usersStream.collect(Collectors.minBy((s1,s2)->s1.getAge()-s2.getAge()));
求平均值:
ListuserList=getUserList();
StreamusersStream=userList.stream();
DoubleavgScore=usersStream.collect(Collectors.averagingInt(UserDTO::getAge));

效果:

3e322330-6998-11ed-8abf-dac502259ad0.png
求和:

写法1:

IntegerreduceAgeSum=usersStream.map(UserDTO::getAge).reduce(0,Integer::sum);

写法2:

intageSumNew=usersStream.mapToInt(UserDTO::getAge).sum();
统计数量:
longcountNew=usersStream.count();
简单分组:

按照具体年龄分组:

//按照具体年龄分组
Map>ageGroupMap=usersStream.collect(Collectors.groupingBy((UserDTO::getAge)));

效果:

3e471614-6998-11ed-8abf-dac502259ad0.png

分组过程加写判断逻辑:

//按照性别分为"男"一组"女"一组
Map>groupMap=usersStream.collect(Collectors.groupingBy(s->{
if(s.getSex().equals("男")){
return1;
}else{
return0;
}
}));

效果:

3e62ead8-6998-11ed-8abf-dac502259ad0.png
多级复杂分组:
//多级分组
//1.先根据年龄分组
//2.然后再根据性别分组
Map>>>moreGroupMap=usersStream.collect(Collectors.groupingBy(

//1.KEY(Integer)VALUE(Map>)
UserDTO::getAge,Collectors.groupingBy(
//2.KEY(String)VALUE(Map>)
UserDTO::getSex,Collectors.groupingBy((userDTO)->{
if(userDTO.getSex().equals("男")){
return1;
}else{
return0;
}
}))));

效果:

3e71325a-6998-11ed-8abf-dac502259ad0.png

来源:blog.csdn.net/qq_35387940/article/details/127008965


审核编辑 :李倩


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

    关注

    20

    文章

    2997

    浏览量

    115663
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73140
  • Stream
    +关注

    关注

    0

    文章

    21

    浏览量

    8218

原文标题:Java 8 Stream 之 collect() 的奇技淫巧

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Arm Neoverse CPU上大代码量Java应用的性能测试

    Java 是互联网领域广泛使用的编程语言。Java 应用的一些特性使其性能表现与提前编译的原生应用(例如 C 程序)大相径庭。由于 Java 字节码无法直接在 CPU 上执行,因此通常运行时在
    的头像 发表于 11-05 11:25 371次阅读
    Arm Neoverse CPU上大代码量<b class='flag-5'>Java</b>应用的性能测试

    翼辉信息RealEvo-Stream 2.0.0重磅发布

    当嵌入式开发迈入 “效率为王、体验至上” 的新时代,开发者对工具的要求早已不止于 “能用”,更追求 “好用、高效、灵活”。作为翼辉信息专为嵌入式领域打造的轻量化开发环境,RealEvo-Stream
    的头像 发表于 10-29 11:45 726次阅读
    翼辉信息RealEvo-<b class='flag-5'>Stream</b> 2.0.0重磅发布

    Java效率提升指南:5个Java工具选型建议及Perforce JRebel和XRebel介绍

    企业级Java环境越来越复杂,真正的破局点,可能不在“人”,而在于“工具”。5个实用建议,帮你理清Java工具的选型思路。
    的头像 发表于 09-11 13:59 908次阅读
    <b class='flag-5'>Java</b>效率提升指南:5个<b class='flag-5'>Java</b>工具选型建议及Perforce JRebel和XRebel介绍

    STM32F405RGT6 ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机,怎么解决?

    ADC1+TIM4触发+DMA(DMA2_Stream0_CH0)+DMA中断完全正常更改为ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机(取消中断后完全正常
    发表于 08-04 07:16

    翼辉信息RealEvo-Stream的高效移植过程

    翼辉新型开发环境 RealEvo-Stream 相比 RealEvo-IDE 功能上有什么差异?相信很多开发者会有这个疑问。先简单回答这个问题,二者面向的用户群体不同,RealEvo-IDE 主要
    的头像 发表于 07-05 16:00 977次阅读
    翼辉信息RealEvo-<b class='flag-5'>Stream</b>的高效移植过程

    RDMA简介8AXI分析

    AXI4 总线是第四代 AXI 总线,其定义了三种总线接口,分别为:AXI4、AXI4-Lite 和 AXI4-Stream接口。其中 AXI4 也称为 AXI4-Full 是一种基于地址的高性能
    的头像 发表于 06-24 23:22 452次阅读
    RDMA简介<b class='flag-5'>8</b><b class='flag-5'>之</b>AXI分析

    RDMA简介8AXI 总线协议分析1

    ,分别为:AXI4、AXI4-Lite 和 AXI4-Stream接口。其中 AXI4 也称为 AXI4-Full 是一种基于地址的高性能传输接口,其支持乱序传输、突发传输等传输方式,同时通过独立
    发表于 06-24 18:00

    EtherCAT运动控制卡应用开发教程之Java

    运动控制卡的Java开发及DLL调用
    的头像 发表于 06-13 14:29 621次阅读
    EtherCAT运动控制卡应用开发教程之<b class='flag-5'>Java</b>

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让开发者即时看到代码更改的效果,从而缩短开发、调试和测试周期,大大提升开发效率。
    的头像 发表于 04-27 13:44 648次阅读
    <b class='flag-5'>Java</b>开发者必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b>开发者在用?

    一文详解Video In to AXI4-Stream IP核

    Video In to AXI4-Stream IP核用于将视频源(带有同步信号的时钟并行视频数据,即同步sync或消隐blank信号或者而后者皆有)转换成AXI4-Stream接口形式,实现了接口转换。该IP还可使用VTC核,VTC在视频输入和视频处理之间起桥梁作用。
    的头像 发表于 04-03 09:28 2238次阅读
    一文详解Video In to AXI4-<b class='flag-5'>Stream</b> IP核

    Java的SPI机制详解

    作者:京东物流 杨苇苇 1.SPI简介 SPI(Service Provicer Interface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义
    的头像 发表于 03-05 11:35 1111次阅读
    <b class='flag-5'>Java</b>的SPI机制详解

    DLPC120+DLP3021是否可以实现live stream?

    DLPC120+DLP3021是否可以实现live stream?
    发表于 02-21 06:16

    Java应用OOM问题的排查过程

    导读 本文记录最近一例Java应用OOM问题的排查过程,希望可以给遇到类似问题的同学提供参考。 前言:此文记录最近一例Java应用OOM问题的排查过程,希望可以给遇到类似问题的同学提供参考。在本地
    的头像 发表于 02-12 11:15 1071次阅读
    <b class='flag-5'>Java</b>应用OOM问题的排查过程

    请问可以关闭FPD-LINKIII的全双工模式,只实现data stream的传输吗?

    为了测试 DS90UB903Q的tJIND&tJINR参数,需要将FPD-LINKIII上的控制信号去掉。如果不去掉,ROUT接口的波形是控制信号和数据信号的叠加。 请问可以关闭FPD-LINKIII的全双工模式,只实现data stream的传输吗?
    发表于 12-26 06:26

    SSM框架在Java开发中的应用 如何使用SSM进行web开发

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web开发中常用的技术栈。它通过分层架构,实现了视图、控制、业务逻辑和数据访问的分离,提高了代码的可维护性和可扩展性
    的头像 发表于 12-16 17:28 2128次阅读