Stream API 优化代码

java1.8以后 关于集合stream.mapToDouble.sum计算精度缺失纪要 /** * 背景:在金额数据计算的时候会存在精度问题,以下是在涉及金额计算过程中Double相关的精度问题纪要。 * 由于此数值的实际使用精度在项目中只有两位,为了保留准确的精度多保留了其余的精度。因此仅供参考。 * 如果是其他的场景,需要根据情况自行调整具体的精度配置。 * * 问题:java1.8以后 关于集合stream.mapToDouble.sum计算精度缺失该如何解决? * 说明: * 如下两个Demo中:testK的正常计算结果应该是2.408631,但是通过sum计算完成后出. 阅读详情

使用Java8中新特性Lambda表达式和流申明式处理数据集合,让代码更简洁

使用一个简单的员工类来学习使用方法

public class Employee {

        /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

    /**
     * 薪资
     */
    private double salary;

    /**
     * 部门
     */
    private String dept;

    public Employee(String name, int age, String dept, double salary) {
        this.name = name;
        this.age = age;
        this.dept = dept;
        this.salary = salary;
    }

    //...省略
}

测试集合(模拟数据查询出来的数据)

List<Employee> stuList = new ArrayList<>();
stuList.add(new Employee("小明", 18, "开发部", 2000.00));
stuList.add(new Employee("小红", 20, "开发部", 2100.00));
stuList.add(new Employee("小强", 25, "测试部", 2200.00));

年龄小于25岁的员工姓名按年龄排序

List<String> result = stuList.stream()
                //筛选出年龄小于25岁的员工
                .filter(stu -> stu.getAge() < 25)
                //根据年龄进行排序
                .sorted(comparing(Employee::getAge))
                //获取员工姓名
                .map(Employee::getName)
                //转换为List
                .collect(Collectors.toList());

按员工部门进行分类

Map<String, List<Employee>> deptEmployee = stuList.stream()
                .collect(groupingBy(Employee::getDept));

filter的方法参数为一个条件,filter筛选年龄大于25岁的员工

List<Employee> employeeFilter = stuList.stream()
                .filter(i -> i.getAge() > 25)
                .collect(toList());

distinct去除重复元素(不能根据对象属性内容去重)

List<Employee> employeeDistinct = stuList.stream()
                .distinct()
                .collect(toList());

limit返回指定流个数,limit的参数值必须>=0

List<Employee> employeeLimit = stuList.stream()
                .limit(3)
                .collect(toList());

skip跳过流中的元素,skip的参数值必须>=0,从第三个元素开始取值

List<Employee> employeeSkip = stuList.stream()
                .skip(2)
                .collect(toList());

map方法类似一个迭代器,获取集合中的部门

List<String> dept = stuList.stream()
                .map(i->i.getDept())
                .collect(Collectors.toList());

flatMap流转换, 获取员工列表中部门,有多个部门的按逗号分割并去重

List<String> deptDistinct = stuList.stream()
                .map(w -> w.getDept().split(","))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(Collectors.toList());

获取员工年龄中最小值

Optional<Integer> min = stuList.stream()
                .map(Employee::getAge)
                .min(Integer::compareTo);

获取员工年龄中最小值

OptionalInt min2 = stuList.stream()
                .mapToInt(Employee::getAge)
                .min();

获取员工年龄中最大值

Optional<Integer> max = stuList.stream()
                .map(Employee::getAge)
                .max(Integer::compareTo);

获取员工年龄中最大值

OptionalInt max2 = stuList.stream()
                .mapToInt(Employee::getAge)
                .max();

minBy获取员工年龄最小值

Optional<Integer> minBy = stuList.stream()
                .map(Employee::getAge)
                .collect(minBy(Integer::compareTo));

maxBy获取员工年龄最大值

Optional<Integer> maxBy = stuList.stream()
             	.map(Employee::getAge)
             	.collect(maxBy(Integer::compareTo));

reduce获取获取员工年龄最大值

Optional<Integer> reduceMin = stuList.stream()
                .map(Employee::getAge)
                .reduce(Integer::min);

reduce获取获取员工年龄最大值

Optional<Integer> reduceMax = stuList.stream()
                .map(Employee::getAge)
                .reduce(Integer::max);

求和, 员工的薪资之和

double sum = stuList.stream()
        .collect(summingDouble(Employee::getSalary));
double sum2 = stuList.stream()
        .map(Employee::getSalary)
        .reduce(0.00, Double::sum);
double sum3 = stuList.stream()
        .mapToDouble(Employee::getSalary)
        .sum();

averagingInt求员工年龄平均值

double average = stuList.stream()
                .collect(averagingInt(Employee::getAge));

summarizingInt同时求员工薪资总和、平均值、最大值、最小值

DoubleSummaryStatistics doubleSummaryStatistics = stuList.stream()
                .collect(summarizingDouble(Employee::getSalary));
//获取平均值
double summarizingDoubleAverage = doubleSummaryStatistics.getAverage();  
//获取最小值
double summarizingDoubleMin = doubleSummaryStatistics.getMin();  
//获取最大值
double summarizingDoubleMax = doubleSummaryStatistics.getMax();  
//获取总和
double summarizingDoubleSum = doubleSummaryStatistics.getSum();  

返回员工姓名List集合

List<String> nameList = stuList.stream()
                .map(Employee::getName)
                .collect(toList());

返回员工姓名Set集合

Set<String> nameSet = stuList.stream()
                .map(Employee::getName)
                .collect(toSet());

通过joining用逗号拼接员工姓名

String joinName = stuList.stream()
                .map(Employee::getName)
                .collect(joining(", "));

通过groupingBy进行员工部门分组

Map<String, List<Employee>> deptGroup = stuList.stream()
                .collect(groupingBy(Employee::getDept));

allMatch匹配所有,员工年龄都大于60

boolean allMatch = stuList.stream()
                .allMatch(i -> i.getAge() > 60);

anyMatch匹配其中一个,存在员工年龄大于60的员工

boolean anyMatch = stuList.stream()
                .anyMatch(i -> i.getAge() > 60);

noneMatch全部不匹配,员工年龄都小于60

boolean noneMatch = stuList.stream()
                .noneMatch(i -> i.getAge() > 60);

通过count统计员工个数

Long count = stuList.stream()
                .count();

通过counting统计员工个数

Long counting = stuList.stream()
                .collect(counting());

findFirst查找年龄大于60岁的第一个员工

Optional<Employee> findFirst = stuList.stream()
                .filter(i -> i.getAge() > 60)
                .findFirst();

findAny随机查找一个年龄大于60岁的第一个员工

Optional<Employee> resultFindAny = stuList.stream()
                .filter(i -> i.getAge() > 60)
                .findAny();

partitioningBy进行分区, 对年龄大于60的与小于等于60的分区

Map<Boolean, List<Employee>> partitioningBy = stuList.stream()
                .collect(partitioningBy(i -> i.getAge() > 60));

对一个集合中的值进行求和

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
//对一个集合中的值进行求和
int integerListSum = integerList.stream()
        .reduce(0, (a, b) -> (a + b));

//对一个集合中的值进行求和
int integerListSum2 = integerList.stream()
        .reduce(0, Integer::sum);

foreach进行元素遍历

stuList.stream().forEach(System.out::println);
Stream API 优化 Java 代码!!! 流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算。 阅读详情

相关推荐

F280049C_HRPWM_死区时间高精度控制与MEP技术实战解析

本文深入解析了F280049C的HRPWM模块及其基于MEP技术的死区时间高精度控制。通过实测数据与TI官方代码对比,详细阐述了DBREDHR和DBFEDHR寄存器的配置技巧、精度优化方法及常见问题调试,为电源管理和电机控制应用提供了实用的实战指南。

yolo5detector的博客 217

java map double_Java Stream mapToDouble()用法及代码示例

Stream mapToDouble(ToDoubleFunction映射器)返回DoubleStream,该DoubleStream包含将给定函数应用于此 Stream 的元素的结果。Stream mapToDouble(ToDoubleFunction映射器)是一个中间操作。这些操作总是很懒。在Stream实例上调用中间操作,并在完成处理后将中间实例作为输出提供。用法:DoubleStream...

weixin_39690097的博客 6354

SolidWorks草图绘制实战:如何用图片参考快速搞定智能小车底板设计

本文详细介绍了在SolidWorks中利用图片参考进行草图绘制的实战方法,以智能小车底板设计为例,帮助设计师快速将概念转化为精准三维模型。通过插入、对齐参考图片并高效描图,结合参数化约束与尺寸驱动,大幅提升设计效率和准确性,尤其适合新手入门与老手优化工作流。

rust6ferris的博客 219

通过自定义收集器解决Collectors.summingDouble计算精度丢失问题

1、自定义收集器Collectorreturn Collector . of(//1、结果容器() -> new BigDecimal [ 1 ] , //2、累加器(result , item) -> {if(item!= 0) {= null) {} else {} } } , //3、并行计算时的合并器(result1 , result2) -> {} , //4、结果转换 total -> total [ 0 ] . doubleValue());2、通过自定义收集器计算。

弹指天下 3695

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7119

遥感图像小白--2--图像分割

遥感图像分割基础入门

Mary的博客 4237

Collectors.summingDouble()

Collectors.summingDouble() Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作。 Collectors.summingDouble() 方法将流中的所有元素视为 Double类型,并计算所有元素的总和 ( sum ) summingDoubleExample代码 @Test

技匠而已 7496

四款办公Agent实测对比:WorkBuddy、千问办公、库库AI、豆包工作怎么选

AI Agent是一种能感知环境、自主决策并执行动作的智能系统,其核心在于工具调用、状态管理与错误恢复构成的执行闭环。在办公场景中,任务边界清晰、容错率高、重复性强,使Agent成为最容易落地的方向。通过调用本地文件、脚本或办公套件,Agent能自动完成文件批量处理、文档摘要、会议纪要等重复劳动,显著提升工作效率。目前WorkBuddy、千问办公、库库AI、豆包工作等产品分别从本地操作、办公套件嵌入、知识处理、轻量助手等路线切入,用户可根据自身场景选择。

weixin_29052717的博客 524

java代码之美(2)---Java8 Stream

Stream 第一次看到Stream表达式就深深把我吸引,用它可以使你的代码更加整洁而且对集合的操作效率也会大大提高,如果你还没有用到java8的Stream特性,那就说明你确实out啦。 一、概述 1、什么是Stream Stream是一种可供流式操作的数据视图有些类似数据库中视图的概念它不改变源数据集合如果对其进行改变的操作它会返回一个新的数据集合。 总的来讲它有三大特性:...

a8892117的博客 190

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8426

优化 Java 代码,请使用 Stream API 。

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 需要更多教程,微信扫码即可 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 publicclassDish{ privateStringname; ...

qfguan的博客 289

Simulink开发项1000例实战专栏--实例17:基于 Simulink 的 BLDC 电机驱动系统的设计与实现

项目背景无刷直流电机(BLDC)因其高效、可靠、低维护的特点,广泛应用于电动汽车、无人机、工业自动化等领域。基于 Simulink 的 BLDC 电机驱动系统可以实现对电机的精确控制,包括速度控制、位置控制和转矩控制。通过仿真和测试,可以优化控制算法,提高系统的性能和可靠性。

xiaoheshang_123的博客 562

使用Stream API优化 Java 代码

Java8的Stream API通过流式操作和Lambda表达式显著简化了集合处理代码。文章对比了传统方式与Stream API实现数据筛选、排序和分组的功能,展示了后者只需几行代码即可完成复杂操作。Stream API提供了filter、distinct、limit、skip、map等中间操作,以及collect、count等终端操作,支持链式调用和延迟计算。生成流的方式包括集合、数组、值、文件和函数。Stream API使代码更简洁易读,大幅提升开发效率。

月色真美 风也温柔 748

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Stream API优化代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的用户进行一个处理: 筛选出年龄小于18的用户 对筛选出的用户进行一个排序 获取排序后用户的名字 public class User { private Str...

天宇的博客 234

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用 Stream API 优化你的代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java publicclassD...

Java笔记虾 1686

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用 Stream API 高逼格 优化 Java 代码!

使用 Stream API 高逼格 优化 Java 代码! 转载:https://mp.weixin.qq.com/s/jX1vrW3FCBMum8dbnyWfaQ 转载理由:之前也写过简单的demo,好久没用了,回顾下

Object的博客 183

巧用 Stream API 优化 Java 代码

使用Stream API优化代码 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java public class Dish { private String name; private boolean vegetarian; pri

qq_35770564的博客 223

学会使用 Stream API 优化你的代码

作者:何甜甜在吗juejin.im/post/5d8226d4e51d453c135c5b9aJava8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,...

Java笔记虾 768

放大招,如何使用Stream API优化代码?

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 01 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java public class Dish { ...

mifffy_java的博客 267

使用Stream API优化代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 原文:https://juejin.cn/post/6844903945005957127 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java public class Dish { private ..

haifei0926的专栏 266

使用 Stream API 优化 Java 代码

放大招,流如何简化代码 什么是流 如何生成流 流的操作类型 流使用 中间操作 终端操作 总结 大家好,我是基基! “ Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行..

lucky的专栏 140
上一篇: spring-retry失败重试
下一篇: JAVA实现JWT
l_learning
博客等级 码龄8年 15粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值