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

    文章

    2957

    浏览量

    104539
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68333
  • Stream
    +关注

    关注

    0

    文章

    20

    浏览量

    7960

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

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

收藏 人收藏

    评论

    相关推荐

    Java中时间戳的使用

    Java中时间戳的使用
    的头像 发表于 11-06 16:04 126次阅读
    <b class='flag-5'>Java</b>中时间戳的使用

    FPGA Verilog HDL有什么奇技巧?

    今天给大侠带来在FPAG技术交流群里平时讨论的问题答疑合集(九),以后还会多推出本系列,话不多说,上货。 交流问题(一) Q:Verilog 有什么奇技淫巧? A:在 Verilog 中,以下这些
    发表于 09-12 19:10

    华纳云:java web和java有什么区别java web和java有什么区别

    Java Web和Java是两个不同的概念,它们在功能、用途和实现方式上存在一些区别,下面将详细介绍它们之间的区别。 1. 功能和用途: – Java是一种编程语言,它提供了一种用于开发各种应用程序
    的头像 发表于 07-16 13:35 677次阅读
    华纳云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别

    Oracle确认Java/JDK 11官方支持延长至2032年1月 

    此外,Solaris操作系统上的Java SE 8Java SE 11的官方支持也同步延期至2030年12月及2032年1月,进一步延长了该平台上的Java服务周期。
    的头像 发表于 05-16 15:57 1106次阅读

    已经安装了Java,且依然提示安装Java是为什么?

    我已经在机器上安装了最新版的 Java 10,打开 Cube 却得到要求安装 Java 1.7.0_45 的提示。何解?Eclipse CDT 依赖 Java,不可卸载重装。
    发表于 04-26 06:23

    java实现多线程的几种方式

    了多种实现多线程的方式,本文将详细介绍以下几种方式: 1.继承Thread类 2.实现Runnable接口 3.Callable和Future 4.线程池 5.Java 8
    的头像 发表于 03-14 16:55 574次阅读

    Android编译优化混淆配置

    为了使用java8及后续java新版本的特性,Google增加了一步编译过程—脱糖(desugaring),但这一步会导致更长的编译时间,这也是为什么Google会推出D8和R8编译器
    的头像 发表于 12-21 09:21 2013次阅读
    Android编译优化<b class='flag-5'>之</b>混淆配置

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

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

    java环境搭建及配置教程

    Java是一种广泛使用的编程语言,用于开发各种应用程序。在开始学习和使用Java之前,您需要搭建和配置Java开发环境。本教程将提供详细的Java环境搭建及配置指南。 下载
    的头像 发表于 12-06 15:50 746次阅读

    idea怎么创建Java项目

    创建Java项目是一个相对较为复杂的过程,需要考虑到各种细节和步骤。本文将详细介绍如何创建一个Java项目。 一、准备工作 在创建Java项目之前,我们需要进行一些准备工作,主要包括以下几个方面
    的头像 发表于 12-06 14:09 881次阅读

    eclipse怎么运行java项目

    在Eclipse中运行Java项目是非常简单的。下面了解一下如何在Eclipse中运行Java项目。 首先,确保您已经在Eclipse中创建了Java项目。如果您尚未创建,请按照以下步骤进行操作
    的头像 发表于 12-06 11:25 1948次阅读

    哪一个stream的内置方法不属于中间操作

    Java中的流(Stream)是用于处理集合数据的一种非常强大和灵活的机制。流可以被视为从源数据中生成的元素序列。流可以被用于对集合中的元素进行过滤、映射、排序等操作,可以通过使用中间操作和末端操作
    的头像 发表于 12-05 14:18 381次阅读

    Java怎么排查oom异常

    Java中的OOM(Out of Memory)异常是指当Java虚拟机的堆内存不足以容纳新的对象时抛出的异常。OOM异常是一种常见的运行时异常,经常出现在长时间运行的Java应用程序或处理大数
    的头像 发表于 12-05 13:47 1210次阅读

    byte属于java基本类型吗

    是的,byte属于Java的基本数据类型之一。Java中共有8种基本数据类型,分别是byte、short、int、long、float、double、char和boolean。byte类型用于表示
    的头像 发表于 12-05 10:40 823次阅读

    Java各种类的区别

    8种基本类型:byte、short、int、long、float、double、char和boolean。这些基本类型都有对应的包装类,用于将基本数据类型转化为对象。 包装类: 包装类是一种特殊的类,用于将基本数据类型封装为对象。在Java中,每一种基本数据类型都有对应
    的头像 发表于 12-03 11:08 7644次阅读