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
    +关注

    关注

    19

    文章

    2904

    浏览量

    102991
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66751
  • Stream
    +关注

    关注

    0

    文章

    20

    浏览量

    7923

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

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

收藏 人收藏

    评论

    相关推荐

    在SpinalHDL里在顶层一键优化Stream/Flow代码生成

        在SpinalHDL里在顶层一键优化代码中Stream/Flow代码生成的payload,fragment。 难看的代码       来看一段代码:   import
    的头像 发表于 12-14 09:05 334次阅读

    JavaStream的常用知识

    ?我们都知道,传统的处理中,每一步我们都需要通过循环控制,逻辑控制,解包,重新装箱这些工作。 非生产线示意处理图 这些步骤让我们的程序的业务逻辑支离破碎,经常处理数据类的小伙伴尤为痛苦。幸运的是,Java8为我们引入了Stream,使用
    的头像 发表于 10-11 15:45 255次阅读
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知识

    Guava Collect常见的集合类

    集合操作是编程中使用频率非常高的,所有有一款针对集合的操作工具是非常有必要的。通过框架提供的工具一方面可以减少开发相似功能的耗时;同时框架在安全与稳定性上更被推荐。 Guava Collect
    的头像 发表于 10-08 11:35 260次阅读

    Stream API原理介绍

    Stream API 是 Java 8 中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。 1.
    的头像 发表于 09-30 15:31 348次阅读

    Java8的Stream流 map() 方法

    8 之后,对集合可以进行 Stream 操作,使上面的处理更简洁。 概述 Stream 流式处理中有 map() 方法,先看下其定义,该方法在java.util.stream.Stream类中 可以看到
    的头像 发表于 09-25 11:06 714次阅读
    <b class='flag-5'>Java</b>8的<b class='flag-5'>Stream</b>流 map() 方法

    LogiCORE IP AXI4-Stream FIFO内核解决方案

    LogiCORE IP AXI4-Stream FIFO内核允许以内存映射方式访问一个AXI4-Stream接口。该内核可用于与AXI4-Stream IP接口,类似于LogiCORE IP AXI以太网内核,而无需使用完整的D
    的头像 发表于 09-25 10:55 596次阅读
    LogiCORE IP AXI4-<b class='flag-5'>Stream</b> FIFO内核解决方案

    Stream的核心概念

    Stream 是 Rust 语言中的一种迭代器,它可以使得我们在处理数据时更加高效、灵活。Stream 不仅可以处理大量数据,还可以进行异步操作,这使得它在处理网络请求等 IO 操作时非常
    的头像 发表于 09-19 16:19 282次阅读

    Stream模块的基础用法和进阶用法

    在 Rust 语言中,Tokio 是一个非常流行的异步编程框架。它提供了一系列的模块,其中最常用的就是 Stream 模块。Stream 模块允许我们以异步的方式处理数据流,这在很多情况下非常
    的头像 发表于 09-19 15:33 709次阅读

    用了Stream后,代码反而越写越丑?

    Java中,同样的功能,代码行数写的少了,并不见得你的代码就好。由于Java使用;作为代码行的分割,如果你喜欢的话,甚至可以将整个Java文件搞成一行,就像是混淆后的JavaScript一样。
    的头像 发表于 08-23 15:08 262次阅读

    MySQL优化并不像大家所想的那样简单

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?
    的头像 发表于 08-23 09:40 437次阅读
    MySQL优化并不像大家所想的那样简单

    怎么使用Java8的Stream API比较两个List的差异呢?

    可以使用Java8的Stream API来比较两个List的差异,并取出不同的对象。
    的头像 发表于 08-12 11:15 1581次阅读

    Stream-it!-RZ-V2快速入门指南

    Stream-it! - RZ-V2 快速入门指南
    发表于 07-10 18:58 0次下载
    <b class='flag-5'>Stream</b>-it!-RZ-V2快速入门指南

    Video In to AXI4-Stream IP核知识介绍

    大家好!今日分享一些关于Video In to AXI4-Stream IP 核的知识。在具体学习IP核的过程中,我也将分享一些关于如何看xilinx英文文档的技巧。
    的头像 发表于 05-18 14:55 1054次阅读
    Video In to AXI4-<b class='flag-5'>Stream</b> IP核知识介绍

    浅析Stream里的隐式转换

    Stream、Flow是在电路描述里经常用到的对象。
    的头像 发表于 05-15 17:36 307次阅读
    浅析<b class='flag-5'>Stream</b>里的隐式转换

    ARM SMMU Data structures之Stream Table

    incoming transaction的StreamID可以找到一个STE。SMMU支持两种Stream table格式,格式由Stream table base registers设置。
    的头像 发表于 05-11 09:22 808次阅读
    ARM SMMU Data structures之<b class='flag-5'>Stream</b> Table