lambda表达式实现list转map

lambda -- list转map package com.example.demo.util; import com.example.demo.entity.UserPO; import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 过滤list中对象的某个属性非空,然后返回一个新的lis 阅读详情

 

利用java8新特性,可以用简洁高效的代码来实现一些数据处理。

定义1个Apple对象:

public class Apple {
    private Integer id;
    private String name;
    private BigDecimal money;
    private Integer num;
    public Apple(Integer id, String name, BigDecimal money, Integer num) {
        this.id = id;
        this.name = name;
        this.money = money;
        this.num = num;
    }
}
添加一些测试数据:
List<Apple> appleList = new ArrayList<>();//存放apple对象集合
 
Apple apple1 =  new Apple(1,"苹果1",new BigDecimal("3.25"),10);
Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);
Apple apple2 =  new Apple(2,"香蕉",new BigDecimal("2.89"),30);
Apple apple3 =  new Apple(3,"荔枝",new BigDecimal("9.99"),40);
 
appleList.add(apple1);
appleList.add(apple12);
appleList.add(apple2);
appleList.add(apple3);

1、分组
List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:

//List 以ID分组 Map<Integer,List<Apple>>
Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
 
System.err.println("groupBy:"+groupBy);
{1=[Apple{id=1, name='苹果1', money=3.25, num=10}, Apple{id=1, name='苹果2', money=1.35, num=20}], 2=[Apple{id=2, name='香蕉', money=2.89, num=30}], 3=[Apple{id=3, name='荔枝', money=9.99, num=40}]}

2、List转Map
id为key,apple对象为value,可以这么做:

/**
 * List -> Map
 * 需要注意的是:
 * toMap 如果集合对象有重复的key,会报错Duplicate key ....
 *  apple1,apple12的id都为1。
 *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
 */
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
打印appleMap
{1=Apple{id=1, name='苹果1', money=3.25, num=10}, 2=Apple{id=2, name='香蕉', money=2.89, num=30}, 3=Apple{id=3, name='荔枝', money=9.99, num=40}}

3、过滤Filter
从集合中过滤出来符合条件的元素:

//过滤出符合条件的数据
List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());
 
System.err.println("filterList:"+filterList);
[Apple{id=2, name='香蕉', money=2.89, num=30}]

4.求和
将集合中的数据按照某个属性求和:

//计算 总金额
BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
System.err.println("totalMoney:"+totalMoney);  //totalMoney:17.48


5.查找流中最大 最小值
Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值。


Optional<Dish> maxDish = Dish.menu.stream().
      collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));
maxDish.ifPresent(System.out::println);
 
Optional<Dish> minDish = Dish.menu.stream().
      collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
minDish.ifPresent(System.out::println);


6.去重
import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
 
// 根据id去重
     List<Person> unique = appleList.stream().collect(
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(comparingLong(Apple::getId))), ArrayList::new)
        );

 

下表展示 Collectors 类的静态工厂方法。

工厂方法    返回类型    作用
toList    List<T>    把流中所有项目收集到一个 List
toSet    Set<T>    把流中所有项目收集到一个 Set,删除重复项
toCollection    Collection<T>    把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)
counting    Long    计算流中元素的个数
sumInt    Integer    对流中项目的一个整数属性求和
averagingInt    Double    计算流中项目 Integer 属性的平均值
summarizingInt    IntSummaryStatistics    收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值
joining    String    连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))
maxBy    Optional<T>    一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minBy    Optional<T>    一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing    归约操作产生的类型    从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen    转换函数返回的类型    包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingBy    Map<K, List<T>>    根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningBy    Map<Boolean,List<T>>    根据对流中每个项目应用谓词的结果来对项目进行分区

用 Lambda 表达式处理 Java Stream 流操作 在 Java 编程领域,Lambda 表达式与 Stream API 的组合堪称一对强大的搭档,极大地简化了集合数据处理的过程。本文将深入探讨如何借助 Lambda 表达式实现各种常见的 Stream 流操作。 阅读详情

相关推荐

java8使用Lambda表达式list转map-含实例解释

Public Map<String, String> findAllMap() { List<CourseType> courseTypeList = findAll(); if (ObjectUtils.isNotNull(courseTypeList)) return courseTypeList.stream().collect(Co...

Smile_Sunny521的博客 1万+

Lambda表达式(3)|(List对象转map)

本章节主要介绍java8的新特性Lambda表达式基于List实现根据object字段对数据进行转换、或者聚合转换。主要函数是Collectors.groupingBy()、Collectors.partitioningBy()、Collectors.toMap()。

Oaklkm的博客 1万+

Unity PBR实战:从零打造丝绸材质各向异性高光效果

本文详细介绍了在Unity中实现丝绸材质各向异性高光效果的PBR实战技巧。通过改造Standard Shader、适配IBL环境光以及高级效果调优,开发者可以创建出逼真的丝绸材质,展现动态光纹变化。文章包含关键代码示例和参数配置建议,特别适合需要提升材质表现力的Unity开发者。

weixin_29015483的博客 461

Java - Lambda List 转 Map 几种方式

我们平时在项目中经常会遇到 List 转 Map 的情况,但是传统的方式又显得太臃肿,于是就想到 Lambda 神器,今天我们就来看看都有哪几种转换方式(List -> Map)

6550

避坑指南:华为2288H-V5服务器安装系统时常见的RAID与驱动问题解决方案

本文针对华为2288H-V5服务器在安装系统时常见的RAID与驱动问题,提供了详细的避坑指南。文章深度解析了从BIOS版本兼容性核查、RAID配置实战到驱动加载与集成的全流程,重点解决了安装过程中因RAID控制器驱动缺失或兼容性问题导致的硬盘无法识别等典型故障,帮助用户高效完成系统部署。

weixin_29240711的博客 983

ABAP on HANA/CDS view/AMDP 大乱炖

文章目录1. HANA的三大杀器1.1 内存式数据库1.2 多核架构1.3 列式存储1.3.1 数据压缩1.3.2 并行处理1.3.3 聚集和索引1.3.4 代码下移2. CDS 概念2.1 ABAP 开发环境2.2 OPEN SQL语句2.3 CDS 到底是啥2.4 CDS 类型2.5 创建CDS view3. CDS 实战3.1 Annotation注解3.2 Case 语句3.3 数学计算3.4 字符串表达3.5 货币转换3.6 聚集语句3.7 Join3.8 Union3.9 参数3.10 作为子C

weixin_45689053的博客 4788

java Lambda表达式List快速转Map

工作经常会遇到list转为map的情况,可能我们只需要某个字段的值转为map集合,在jdk8以前,我们更多地可能会用for循环的方式,然后put到map中去,有了jdk8之后,我们可以使用简单的一句话,就可以搞定 List<UserBean> userList = new ArrayList<>(); UserBean userBean = new UserBean("张三","热爱学习", 21); userList.add(userBean); userBea

m0_54849873的博客 8072

STM32的GPS数据提取程序设计说明——基于NMEA0183协议

一、硬软件平台 本次程序实现效果为对GPS信号穿送来的数据进行筛选,并将筛选后的信息通过上位机显示出来,所以此次设计所需硬件包括STM32F407、RS232转TTL、CH340USB转串口模块,注意该模块在使用前,对应的系统需要安装驱动,否则串口调试助手无法识别,另外还包括JLink下载器。 本次代码设计软件为KEIL5并结合F4固件包,上位机系统为WIN7,主机系统为WIN10。 二、算法总体思路设计 由于GPS通过RS232将数据传送给板子,因此使用两个串口资源(串口1和串口2),其中一个用来

小景的博客 6181

Java lambda表达式实现List转Map

将List分组转成Map是日常开发中常见的需求,我们就来总结一下常见的几种写法。 有如下代码: @Data class Person { private String uuid; private String name; private String gender; private int age; public Person(String name, String gender, int age) { this.uuid = UUID.random

代码君 1万+

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 277

跟着团子学SAP PS:BOM和项目结构的联动-BOM Transfer CN33

关于项目中的物料组件挂接你需要了解的一点功能

Lucas1211的博客 2万+

Java8Lambda表达式实现List转Map

Java8通过Lambda表达式实现List转Map

Dantesding的博客 437

把 ABAP Smart Form 输出变成可直接下载的 PDF 二进制:OTF 到 XSTRING 的一条龙实践

SAP Smart Forms 生成 PDF 的实用方案:通过 OTF 格式转换实现高效输出。Smart Forms 本身不直接生成 PDF,而是输出 OTF 格式数据,需通过 CONVERT_OTF 函数转换。本文提供两种实现路径:传统的 Spool 方式和更优的直接获取 OTF 方式,后者避免了 Spool 的维护负担。核心代码演示了如何通过设置 GETOTF 参数获取 OTF 数据,并转换为 PDF 二进制流,适用于前端下载、接口传输等场景。同时介绍了 SSF_OPEN/SSF_CLOSE 方法用于批

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 676

运用java8 lambda表达式实现List转Map

https://yanyan.club/archives/maptolist

weixin_45259157的博客 386

JavaScript高级程序设计

作者:禅与计算机程序设计艺术 1.简介 JavaScript(简称JS)是一种直截了当、简单易用的动态脚本语言。它最初由Netscape公司的Brendan Eich(布兰登·艾奇)于1995年创建,但后来逐渐成为事实上的通用编程语言。目前,JS已经成为世界上最流行的客户端脚本语言,广泛用于网页开发、移

AI天才研究院 2268

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java8 lamda表达式对List进行分组,List按条件过滤

示例对象: public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer n...

我的博客 3万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java8使用Lambda表达式(流式)快速实现List转map 、分组、过滤等操作

Java8使用Lambda表达式(流式)快速实现List转map 、分组、过滤等操作

吴名氏的博客 13万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

从多个角度详解map转为list

本文从多个角度详解了Java中如何将map转为list,介绍了基础方法、Lambda表达式、Guava库以及Apache Commons库中的相关工具类和方法。每种方法都有自己的优缺点和适用场景。在实际开发中,我们可以根据具体的需求选择最合适的方法。

u013733643的博客 2万+

Lambda表达式 入门实战

import cn.sh.ideal.bean.UserBean; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; /** * Lambda表达式写法 * * @author gilbert */ public class LambdaDemo { /** * 功能描述 无参无返.

心有猛虎细嗅蔷薇 415

Java使用小算法List集合数据匹配

两个集合匹配算法 @Test public void testCouple2() { // 用于计算循环次数 int count = 0; // 老公组 List<Couple> husbands = new ArrayList<>(); husbands.add(new Couple(1, "梁山伯")); husbands.add(new Couple(2, "牛郎")); husbands.add(new Couple(3, "干将")); husbands.add(new C

jiatai_的博客 2279

Java8新特性之Stream详解二

       最近在公司的项目中常用Stream结合Lambda表达式来操作集合,使得项目整体代码简洁和整齐;并且上一章也讲了一些关于Stream的常用操作,比如:map()、filter()、concat()、reduce()、max()、min()、distinct()等常用操作。这篇我就分享一下Stream中List、Set、Map之间的转换操作: 准备工作:新建一个Course类,包含n...

蜜蜂采蜜 620

Function示例

Function示例 在Java8中,Function是一个功能接口,它接收一个实参(T类型的对象),返回一个对象(R类型的对象),实参和返回的对象可以是不同的类型 Function.java @FunctionalInterface public interface Function<T, R> { R apply(T t); } T——function接收的参数类型 R——function返回的结果类型 Function<T, R> 下面示例展示了接收一

春风落叶的博客 1283

20230925工作心得

那么直接加个if/else判断就好了。如果map.containsKey,那么就把值追加上去,否则就直接put。

赵达宇的博客 308

Java 中使用 Stream 将 List 转换为 Map 实战笔记(生产级版)

下文示例基于User类,含常见属性及 getter 方法(生产中建议用 Lombok 简化,@Data@Data // Lombok 注解:自动生成 getter/setter/equals/hashCode/toString// 包装类型,可能为 null(需特别处理)// 可能为 null// 基本类型,无 null 问题生产级首选// 自定义复合 Key(必须不可变 + 重写 equals 和 hashCode)

DolphinHome的博客 1325

Java8 将list转为map

本文介绍了Java Stream中使用Collectors.toMap()的几种常见用法:1)将List转为ID-Name的Map;2)使用Function.identity()转为ID-实体的Map;3)处理重复key的冲突解决方案;4)指定具体Map实现类(如LinkedHashMap)进行收集。重点讲解了如何通过合并函数解决键冲突,以及如何选择不同的Map实现类来满足特定需求,使代码更简洁优雅。

icefan02的专栏 230

Java8 Lambda表达式 List转Map

这个其实是我自己在开发中遇到的一个坑,由于没有写这个,在key重复的时候,抛出了异常,很是恼火,于是当然也想第一次使用一样,不懂,于是点进源码瞅了瞅,然后查阅资料,于是乎就出现了上面我这种写法:(key1, key2) -> key2,它的意思是如果两个key重复了,让后面的key覆盖前面的key,完美解决bug.欢迎大家给我留言可以一起讨论哦。本文从toMap底层介绍了一下Java8如何更加优雅的写出List转Map,避免大家跟我一样,在开发中被”叼“,希望大家学以致用,跟我一样,写优雅的代码。

weixin_45289031的博客 4240
上一篇: Collection 和 Collections
下一篇: Thinking In Java TypeInfo 动态代理
junior_programmer
博客等级 码龄11年 16粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值