当前位置: 首页 > news >正文

细数一些 JDK8 踩过的坑,说多了都是泪

来自推荐一个程序员编程资料站http://cxyroad.com副业赚钱专栏https://xbt100.top2024年IDEA最新激活方法后台回复激活码CSDN免登录复制代码插件下载CSDN复制插件以下是正文。最后细数一次 JDK8 踩过的坑往后再不干了重复的事情不应该再做第二遍否则是对生命的不尊重。❝ 本文主要内容JDK8 踩过的坑内容基础。❞「⏱️踩坑的原因未知和遗忘。」本文主要内容第一类 API只有特定参数值才会引发异常相关 API具体描述Collectors.toMap1. 重复值 Duplicate key 错误.....2. value 的 function 计算结果 null 引发 NPEparallelStream 并行流1. ThreadLocal#get() 为 null2. 非安全类数据异常stream#sort 排序排序字段为 null引发 NPE多字段排序常发生java.util.Optional#get/ofof 入参为 null引发 NPEget#value 为 null 异常 ....第二类 API只要运行一次就能察觉错误相关 API具体描述stream#peek非终止 API遇到终止 API 才会执行stream 只能消费一次stream has already been operated upon or closed注下文内容为上面表格的举例说明。Collectors.toMap关于 Collectors.toMap 的易错点主要有两个:key 计算结果重复场景还原具体描述从 DB 查询 List 数据 将 List 转换成 Map方便下一个循环的匹配查找业务执行过程出现了脏数据key 不再唯一引发错误key 是由 Function 方法计算而来Function 计算结果重复引发错误下面案例模拟数据重复值toMap 时出现 duplicate keyMapString, String map Arrays.asList(A, A) .stream() .collect(Collectors.toMap(str - str, Function.identity()));防止脏数据等异常数据一定指定 mergeFunction请使用下面 API 进行 toMaptoMap(Function? super T, ? extends K keyMapper, Function? super T, ? extends U valueMapper, BinaryOperatorU mergeFunction)值为 null场景还原具体描述从 DB 中获取的对象数据进行 toMapvalue 的字段被某业务场景更新为 null 了(或丢失更新)。value 是由 Function 方法计算而来Function 计算为 null下面案例value 值由函数值返回模拟返回 null 运行结果 NPEprivatestatic String returnNull(){ returnnull; } publicstaticvoidmain(String[] args){ MapString, String map Arrays.asList(A, A) .stream() .collect(Collectors.toMap(str - str, str - returnNull(), (first, second) - first)); }parallelStream❝遇到最大的坑直接将 stream 修改成 parallelStream 天真地以为做了性能优化。❞常见 stream 流操作中有 DB 查询、远程 API 等耗时操作直接将 stream 修改成 parallelStream 做优化并行流ThreadLocal#get 异常非线程安全类异常parallelStream 是多线程并行流容易出现多线程问题场景还原具体描述ThreadLocal#get 数据有时候正确ThreadLocal 与当前线程有关系ArrayList 返回条目数不对ArrayList 不是线程安全类下面案例相同代码执行两次结果线程名称不一致。执行第一次执行第二次ThreadLocal 异常的情况模拟用户应用上下文最终获取为 null其他场景不再赘述一定要知道 parallelStream 是并行的多线程的问题它都有。特别注意「数据量小不易察觉」性能优化不能仅仅将 stream 修改成 parallelStream 血泪经验......stream#sort排序字段 null多字段排序在 tob 业务常见常因为第二、三个字段为 null 排序出现 NPE场景还原具体描述业务查询结果先按第一个字段排序相同再按照第二个字段排序......stream 不同于数据库的排序操作为 null 时数据库会默认排序但这个API不会案例模拟从 DB 检索出来的数据按照业务要求进行多字段排序往事同事第一次用这个 API 就出现了线上故障≡(▔﹏▔)≡如果排序字段有可能为空有需要排序可在比较器中加入Comparator.nullsLast(String::compareTo)orComparator.nullsFirst(String::compareTo)为空的会放在前面或后面Optional#get/ofget/ofOptional 被引入用来解决 NPE但下面这两个 API 却容易出现异常 of 入参为 null 抛 NPEget 返回值检查 value 为 null 抛 NoSuchElementException下面是 java.util.Optional#get 方法源码public T get(){ if (value null) { thrownew NoSuchElementException(No value present); } return value; }题外话Optional 是我个人非常喜欢的一个类大大减少了 NPE比如我还用它作出参入参。形如下面public T,R OptionalT function(OptionalR param){ ..... }其他再啰嗦一下边边角角的 APIstream只能消费一次运行一次就知道用错误了好多流的 API 也是只能消费一次下面案例stream 用了多次出现错误peek 方法peek 用的很少个人不推荐用初衷为了 debug 。peek 遇到终止类的 API 才执行。下面案例convenientMap 并不会插入新的元素。只有添加了一些终止操作才会执行。例如collect(Collectors.toList()), forEach等。// toMap 功能 ListTask taskList instTaskBO.getInstanceId(instance.getInstanceId()); MapString, Task convenientMap new HashMap(); // 将 list 转成map taskList.stream().peek(task - convenientMap.put(String.valueOf(task.getId()), task));其他8的日期不熟用的少坑不知道CompletableFuture考虑异常情况join 设置时长下面案例对于异常给一个默认的返回值// 异常情况给一个默认值 private CompletableFutureInteger calculate(SupplierInteger supplier){ return CompletableFuture .supplyAsync(() - invokeTask(supplier)) .exceptionally(throwable - { log.error(....., throwable); return0; }); }总结本文总结个人在使用 JDK8 踩过的坑内容基础。但总结是比较花费精力后面尽量总结研究一些高级点的东西~~~END推荐阅读副业赚钱推荐让你的时间开始变现免费体验AI图片生成就在 Image Generator Hub程序员在线工具站cxytools.com 推荐一个自己写的工具站https://cxytools.com专为程序员设计包括时间日期、 JSON处理、SQL格式化、随机字符串生成、UUID生成、文本Hash...等功能提升开发效 率。 ⬇戳阅读原文直达 朕已阅
http://www.gsyq.cn/news/1367600.html

相关文章:

  • 2026推荐:江门CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 金诚回收
  • 终极解决方案:3步恢复Calibre-Web豆瓣元数据获取功能
  • ChatGPT企业版安全合规全解析:如何在72小时内完成GDPR/等保2.0双认证接入?
  • Go并发读写竞争漏洞:结构体赋值引发的密钥泄露
  • 2026推荐:江门母婴除甲醛CMA甲醛检测治理公司多少钱怎么收费 - 金诚回收
  • 突破窗口限制:SRWE窗口分辨率编辑器的完整指南
  • 我从一次与人工智能无关的数据会议中学到的三大关键数据经验
  • 重塑嵌入式数据库体验:LiteDB.Studio如何让你的数据管理更直观
  • 2026推荐:防城港CMA甲醛检测治理及公共卫生检测报告排行榜(2026版) - 金诚回收
  • TV Bro电视浏览器:如何在智能电视上享受流畅上网体验的完整指南
  • Windows安卓应用安装器:APK Installer完整使用指南
  • 紧急更新!B站2024年Q2审核规则变更后,ChatGPT策划必须重写的4类高危话术(附合规替换对照表)
  • 独立开发者利用Taotoken模型广场与API快速验证多个大模型的创意项目效果
  • 基于多源模型融合的海洋潮汐预测技术深度解析:pyTMD算法实现与应用实践
  • 连续处理双重差分与双重机器学习:以疫苗接种率对死亡率影响评估为例
  • 3大核心功能+70+精选MOD:HS2-HF Patch如何让HoneySelect2新手变高手
  • 终极指南:如何用GHelper手动风扇控制告别ROG笔记本噪音与高温困扰?
  • 多模态光谱融合机器学习:精准解析NMC电池材料微观结构与缺陷
  • 量子机器学习高效初始化:稳定子引导原理与万比特实践
  • PVZ Toolkit终极指南:3步解决植物大战僵尸PC版所有游戏痛点
  • 3分钟快速上手:m4s-converter轻松将B站缓存视频转换为MP4格式的完整指南
  • 终极指南:如何将STL文件快速转换为STEP格式(免费工具完整教程)
  • BG3 Mod Manager:轻松管理《博德之门3》模组的高效工具
  • 如何快速获取B站字幕:解锁视频学习的终极自由
  • 创新方案:如何通过内核态资源调度技术优化腾讯游戏ACE-Guard性能
  • FanControl终极指南:5个步骤实现Windows风扇智能控制,免费打造静音散热系统
  • 量子神经网络在医疗预测中的突破与应用
  • 抖音下载器终极指南:3分钟学会无损音频提取与批量下载
  • 如何为 Claude Code 配置 Taotoken 的 API Key 与 Base URL 实现稳定调用
  • STL转STEP格式转换器:终极免费工具实现CAD工程文件无缝转换