使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值

Stream流的简要 Stream流 阅读详情

不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常:

  1. java.lang.NullPointerException
  2. java.util.NoSuchElementException

因此本篇博客总结下使用Java Stream的部分场景以及如何避免上述的2个异常:

  1. 提取集合中的某一列(普通提取、去重)
  2. 按条件过滤集合
  3. 求和
  4. 最大值/最小值/平均值

1. 数据准备

首先定义下Friend类:

package com.zwwhnly.springbootaction.model;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class Friend {
    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 身高
     */
    private Long height;

    /**
     * 所在城市
     */
    private String city;

    /**
     * 体重
     */
    private BigDecimal weight;

    public Friend(String name, Integer age, Long height, String city, BigDecimal weight) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.city = city;
        this.weight = weight;
    }
}

然后初始化以下数据供后面使用:

public static List<Friend> getFriendList() {
    List<Friend> friendList = new ArrayList<>();
    friendList.add(new Friend("小周", 28, 175L, "郑州", new BigDecimal("101.5")));
    friendList.add(new Friend("小吴", 28, 170L, "洛阳", new BigDecimal("111.5")));
    friendList.add(new Friend("小郑", 29, 176L, "郑州", new BigDecimal("121.5")));
    friendList.add(new Friend("小王", 29, 180L, "北京", new BigDecimal("130")));
    friendList.add(new Friend("小赵", 27, 178L, "苏州", new BigDecimal("140")));
    friendList.add(new Friend("小钱", null, null, "杭州", new BigDecimal("150")));

    return friendList;
}

2. 提取集合中的某一列

2.1 普通提取

比如,我们需要提取出所有朋友的姓名,可以使用Stream的map()方法,实现代码如下所示:

List<Friend> friendList = getFriendList();
List<String> nameList = friendList.stream().map(Friend::getName).collect(Collectors.toList());

nameList.forEach(name -> System.out.println(name));

输出结果:

小周

小吴

小郑

小王

小赵

2.2 提取后去重

比如,我们需要提取出所有朋友的年龄,但是需要去重,可以使用Stream的distinct()方法,实现代码如下所示:

List<Friend> friendList = getFriendList();
List<Integer> ageList = friendList.stream().map(Friend::getAge).distinct().collect(Collectors.toList());

ageList.forEach(age -> System.out.println(age));

输出结果:

28

29

27

3. 按条件过滤集合

比如,我们需要获取所有朋友中年龄在29岁以下,并且身高在170以上的朋友,可以调用filter方法,实现代码如下所示:

List<Friend> friendList = getFriendList();

List<Friend> youngPeople = friendList.stream()
        .filter(friend -> friend.getAge() != null && friend.getAge() < 29 &&
                friend.getHeight() != null && friend.getHeight() > 170L)
        .collect(Collectors.toList());
System.out.println(youngPeople);

输出结果:

Friend(name=小周, age=28, height=175, city=郑州, weight=101.5)

Friend(name=小赵, age=27, height=178, city=苏州, weight=140)

4. 求和

4.1 Integer,Long,Double

比如,我们需要计算出所有朋友的年龄之和,可以调用mapToInt方法,实现代码如下所示:

List<Friend> friendList = getFriendList();

int ageSum = friendList.stream().filter(friend -> friend.getAge() != null).mapToInt(Friend::getAge).sum();
System.out.println(ageSum);

输出结果:

141

注意事项:

因为我们的age字段定义的是包装类型Integer,但求和之后的返回类型为基本类型int,所以在调用mapToInt方法之前,一定要过滤掉年龄为null的数据,否则分分钟抛异常。

比如,我们添加一条年龄为null的数据:

friendList.add(new Friend("小钱",null,178,"杭州"));

然后,我们不过滤null数据,直接调用mapToInt方法,就会抛出java.lang.NullPointerException异常:

List<Friend> friendList = getFriendList();

int ageSum = friendList.stream().mapToInt(Friend::getAge).sum();
System.out.println(ageSum);

如果字段类型是Long或者Double,可以调用相应的mapToDouble、mapToLong,如下所示:

4.2 BigDecimal

和Integer、Long、Double类型不同,如果字段类型是BigDecimal,求和的话需要调用reduce方法,使用方法如下所示:

List<Friend> friendList = getFriendList();

BigDecimal weightSum = friendList.stream()
        .filter(friend -> friend.getWeight() != null)
        .map(Friend::getWeight)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(weightSum);

输出结果:

754.5

注意事项:

为避免java.lang.NullPointerException异常,上面代码中的.filter(friend -> friend.getWeight() != null)也要记得加。

5. 最大值/最小值/平均值

5.1 Integer,Long,Double

比如,我们需要获取所有朋友中身高的最大值,实现代码如下所示:

List<Friend> friendList = getFriendList();

long heightMax = friendList.stream()
        .filter(friend -> friend.getHeight() != null)
        .mapToLong(Friend::getHeight)
        .max().orElse(0);
System.out.println(heightMax);

输出结果:

180

注意事项:

因为max()方法的返回值是OptionalLong类型,所以我们需要继续调用orElse()方法设置个默认值,这里不要直接使用getAsLong()方法,因为当集合为空时,会抛出你肯定遇到过的java.util.NoSuchElementException异常:

long heightMax = friendList.stream()
        .filter(friend -> friend.getHeight() != null)
        .mapToLong(Friend::getHeight)
        .max().getAsLong();

orElse()源码如下所示:

public long orElse(long other) {
    return isPresent ? value : other;
}

getAsLong()源码如下所示:

public long getAsLong() {
    if (!isPresent) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

类似地,获取最小值的代码如下所示:

List<Friend> friendList = getFriendList();

long heightMin = friendList.stream()
        .filter(friend -> friend.getHeight() != null)
        .mapToLong(Friend::getHeight)
        .min().orElse(0);
System.out.println(heightMin);

获取平均值的代码如下所示:

List<Friend> friendList = getFriendList();

double heightAverage = friendList.stream()
    .filter(friend -> friend.getHeight() != null)
    .mapToLong(Friend::getHeight)
    .average().orElse(0D);
System.out.println(heightAverage);

5.2 BigDecimal

比如,我们需要获取所有朋友中体重的最大值,实现代码如下所示:

List<Friend> friendList = getFriendList();

BigDecimal weightMax = friendList.stream()
        .filter(friend -> friend.getWeight() != null)
        .map(Friend::getWeight)
        .max(BigDecimal::compareTo)
        .orElse(BigDecimal.ZERO);
System.out.println(weightMax);

输出结果:

150

注意事项:

1)为避免出现java.lang.NullPointerException异常,注意过滤体重为null的数据

2)因为max()方法的返回值为Optional类型,所以我们需要继续调用orElse()方法设置个默认值,这里不要直接使用get()方法,因为当集合为空时,会抛出你肯定遇到过的java.util.NoSuchElementException异常:

BigDecimal weightMax = friendList.stream()
        .filter(friend -> friend.getWeight() != null)
        .map(Friend::getWeight)
        .max(BigDecimal::compareTo)
        .get();

get()方法源码如下所示:

public T get() {
    if (value == null) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

类似地,获取最小值的代码如下所示:

List<Friend> friendList = getFriendList();

BigDecimal weightMax = friendList.stream()
        .filter(friend -> friend.getWeight() != null)
        .map(Friend::getWeight)
        .min(BigDecimal::compareTo)
        .orElse(BigDecimal.ZERO);
System.out.println(weightMax);

6. 总结

使用Java Stream操作集合非常便利,但还是容易踩一些坑,比如文中提到的java.lang.NullPointerException异常和java.util.NoSuchElementException异常,所以使用时要多多注意,能不踩坑就不踩坑,就算踩坑,也别多次踩同一个坑。

Java 8 stream 流获取 list 中最大值、最小值、总和值、平均值 // list static List<Employee> empList = new ArrayList<Employee>(); private static void initEmp(){ empList.add(new Employee("张三",30)); empList.add(new Employee("张三1",96)); empList.add(new Employee("张三2",23)); empList.add(new Employee("张 阅读详情

相关推荐

Starlink卫星动力学系统仿真建模前传1-时空系统介绍

对于在轨道上运动的航天器由于速度接近第一宇宙速度,为了获取准确的位置信息对时间的精度要求极高,为了准确描述航天器的运动规律,本节对卫星仿真建模中用到的各种时间系统进行介绍。卫星轨道平面为坐标平面,坐标原点位于卫星系统质心,轴由卫星系统质心指向地心(当地垂线),轴在轨道面内垂直于轴并指向卫星的前进方向,轴同、轴构成右手系,指向轨道面负法线方向。不同坐标系下的建立的运动形式与复杂程度不同,会直接影响运动方程的求解繁简程度,因此,选取适当的坐标系具有重要的意义。定义星体坐标系,该坐标系简记为系,与卫星本体固连。

xspace的博客 1439

Java8中Stream流求最大值最小值

【代码】Java8中Stream流求最大值最小值。

qq_43842093的博客 2万+

山石网科Hillstone防火墙基础上网配置_CLI命令行(最新版)

山石网科Hillstone防火墙安全网关基础上网基础网络配置_CLI命令行(最新版)

路与肥的博客 1万+

java中各种类型用Stream流求最大值最小值

java中各种类型用Stream流求最大值最小值。

githubcurry,985cs博士在读 4525

从仿真到实体:基于Isaac Gym的X20机械狗与Kinova Gen3 Lite机械臂全身协同控制实战

本文详细介绍了基于Isaac Gym仿真平台,实现云深处X20机械狗与Kinova Gen3 Lite机械臂全身协同控制的完整实战流程。内容涵盖环境搭建、模型适配、分阶段训练策略、域随机化技巧,以及最终将训练好的策略安全部署到实体机器人的关键步骤,为复杂机器人系统的仿真到实体迁移提供了宝贵经验。

yhn45678901的博客 489

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

Mr_XiMu的博客 3744

使用Stream流进行过滤,并相加计算总和。

需求 对一个集合进行条件过滤,然后计算某个字段值相加后的总数。 /** * 商家卖家交易实体 * */ @Data public class Trade { private String instId;//产品ID private String sz;//交易数量 private String side;//交易方向 buy:买 sell:卖 public Trade() { } } 代码 @Test public void tes

硬核编程乐乐的博客 8599

0032期基于深度学习的大米识别-含数据集

083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

grehtsfrs的博客 1508

stream 提取某字段_使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值...

不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常:java.lang.NullPointerExceptionjava.util.NoSuchElementException因此本篇博客总结下使用Java Stream的部分场景以及如何避免上述的2个异常:提取集合中的某一列(普通提取、去重)按条件过滤集合求和最大值/最小值/平...

weixin_39588104的博客 3992

国产数据库全解析:openGauss、OceanBase、TiDB与KingbaseES的核心优势与应用场景指南

本文将深入剖析openGauss、OceanBase、TiDB和KingbaseES这四款主流国产数据库的核心内容,并针对国产化过程中给出使用建议,以帮助企业根据自身需求选择合适的数据库解决方案。国产数据库在性能、扩展性、兼容性、安全性等方面展现出强大实力,能够满足不同行业、不同场景的需求。企业在进行国产化过程中,应充分考虑业务特点、技术栈、团队能力等因素,结合上述分析,选择最适合自身的国产数据库产品。随着国产数据库技术的持续发展与生态完善,它们将成为推动企业数字化转型、保障数据安全的重要力量。

java专栏 8782

什么是 SAP S/4HANA 的 VDM Layering Architecture 的 CDS Hierarchy View

当涉及SAP S/4HANA的CDS Hierarchy View时,我们正在谈论一种高级数据建模技术,用于构建层次结构化的数据视图,以支持树状和分层数据的处理和分析。CDS(Core Data Services)是SAP的一种数据建模和定义语言,而CDS Hierarchy View则是CDS的一个重要组成部分,用于处理层次数据,如组织结构、产品分类、地理区域等。首先,您可以使用CDS语言创建一个新的CDS Hierarchy View,定义产品分类的层次结构。您还可以定义其他与库存相关的属性。

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

stream 分组求和 bigdecimal_使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值...

不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常:java.lang.NullPointerExceptionjava.util.NoSuchElementException因此本篇博客总结下使用Java Stream的部分场景以及如何避免上述的2个异常:提取集合中的某一列(普通提取、去重)按条件过滤集合求和最大值/...

weixin_39553904的博客 2805

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 606

list stream 最大和最小值_使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值...

不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常:java.lang.NullPointerExceptionjava.util.NoSuchElementException因此本篇博客总结下使用Java Stream的部分场景以及如何避免上述的2个异常:提取集合中的某一列(普通提取、去重)按条件过滤集合求和最大值/最小值/平...

weixin_35723886的博客 3635

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java8利用stream对list集合中的bigdecimal进行分组求和,均值,最大值,最小值

新建接口ToBigDecimalFunction @FunctionalInterface public interface ToBigDecimalFunction<T> { BigDecimal applyAsBigDecimal(T value); } 新建工具类CollectorsUtil public class CollectorsUtil { stati...

文耀文耀的博客 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

超详细的Java8 Stream使用方法:筛选、排序、最大值、最小值、计数求和平均数、分组、合并、映射、去重等

Stream流式操作的常用使用方法 关于函数编程的原理可以参考:Java 8函数式编程#Lambda表达式#方法引用 超详细的Java8 Stream使用方法:筛选、排序、最大值、最小值、计数求和平均数、分组、合并、映射等 涉及Stream中的如下方法:stream()、filter、peek、map、collect、Collectors.toList()、skip、limit、sorted、max、min、distinct、reduce、sum、average、Collectors.groupingBy

HO1_K的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk8 Lambda表达式 集合过滤,排序,最大值,最小值,平均值等操作

package cn.sh.ideal.jdk8; 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...

jucks2611的博客 1万+

获取集合中最大值,list中对象的某个属性的最大值最小值平均值以及筛选

获取集合中最大值最小值 一、 普通集合 1、 查询集合中字符串的个数最多和最少 List<String> strs = new ArrayList<String>(); strs.add("a"); strs.add("ab"); strs.add("qwrrrrrrr"); strs.add("qrqw"); strs.add("qweqw"); strs....

qq_42570364的博客 1万+

list.stream()使用;获取集合中最大值,list中对象的某个属性的最大值最小值平均值以及筛选

获取集合中最大值最小值 一、 普通集合 1、 查询集合中字符串的个数最多和最少 List<String> strs = new ArrayList<String>(); strs.add("a"); strs.add("ab"); strs.add("qwrrrrrrr"); strs.add("qrqw"); strs.add("qweqw"); strs.add("aqw"); System.out.println("最大值: " + Collections.max(strs)

luckyZQC的博客 3万+

JAVA8 list最大值最小值求和平均值

public static void main(String[] args) { List<User> uList=new ArrayList<User>(); uList.add(new User(1, "xxx", 1, 18)); uList.add(new User(2, "zzz", 1, 19)); uList.add(new User(3, ...

Mr.Xie的博客 1万+

java8 新特性 Stream流 分组 排序 过滤 多条件去重 (最小、最大、平均、求和)

java8 新特性 Stream流 分组 排序 过滤 多条件去重 (最小、最大、平均、求和),Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。取出List某一字段所有值。

新起点的博客 1万+

java8-Stream流之数值函数(求和、最大值、最小值、平均值)

//todo stream流的使用 //todo filter:过滤操作;保留符合过滤条件的对象;这是一个中间操作;后面可以带最终操作 //todo mapToInt: 将数据根据double类型来处理; public static void main(String[] args) { List<SalesOrder> list = creat...

dengdai123654的博客 7057

collections求和方法_List使用Stream流进行集合Collection的各种运算汇总:对BigDecimal求和,某个字段的和、最大值、最小值、平均值,字段去重,过滤等...

写Java接口的朋友都知道,Java 8的更新,经常会用到过滤 list 里的数据,本文就对List使用Stream流进行集合Collection的各种运算做一个汇总!优势:Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。通常我们需要多行代码才能完成的操作,借助于Stream流式处理可以很简单的实现。各种Stre...

weixin_29002595的博客 2658

Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计

Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等汇总统计方法找到汇总统计的方法。这些方法属于java 8的汇总统计类。getAverage(): 它返回所有接受值的平均值。getCount(): 它计算所有元素的总数。getMax(): 它返回最大值。getMin(): 它返回最小值。getSum(): 它返回所有元素的总和。看官可以根据自己的需求进行灵活变通。

xiaoheihai666的博客 2万+

Java8 新特性 使用lambda表达式对map集合求和,或平均值、最大值、最小值

一、lambda方法,如下: IntSummaryStatistics statistics= (IntSummaryStatistics) list .stream() .collect( Collectors.summarizingInt( e->Integer.valueOf( ((Map) e).get("xxx Key对象").toString() ))); 具体方法:我们用以上得到的结果 .get,如下图,可以直接获取集合的和,或

JavaWebEngineer的博客 5567
上一篇: Redis深入浅出【九】Redis的事务机制
下一篇: 为什么要谨慎使用Arrays.asList、ArrayList的subList?
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值