我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看

Ego Planner规划算法(上)——Ego Planner流程介绍 本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程 阅读详情

前言

用Java 8 写了一段逻辑,同事居然说看不懂,以下是业务背景,大家可以一起看看!

我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看

 

业务背景

首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传。

而第三方接口返回的数据是 JSON 格式的,其中物流信息却藏的十分深,如下面所示,JSON 节点是这样的:

xxxOrder > xxxShippingInfo > xxxShipmentDetails > xxxTrackingInfo > trackingNumber, trackingLink

基本实现

因为第三方接口返回的数据是 JSON 格式的,所以需要把 JSON 字符串转换成 Java 对象来进行处理。

@JsonIgnoreProperties(ignoreUnknown = true)
public class XxxOrder {
    /**
     * 物流信息
     */
    @JsonProperty("shippingInfo")
    private XxxShippingInfo xxxShippingInfo;
}

上面只是第一层示例,要拿到物流信息,要依次封装四层对象,到真正获取物流信息时要避免空指针,就需要判断四层才能拿到,如示例所示:

if(xxxOrder != null){
    if(xxxOrder.getXxxShippingInfo() != null){
        if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
            if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
                ...
            }
        }
    }
}

获取一个物流信息这么麻烦,我也是醉了,这样写也太不优雅了。

Java 8 实现

因为我知道 Java 8 可以处理这类的需求,所以我从来没想过用最原始的方式去实现,直接把就用 Java 8 来实现了:

/**
* /private String[] getFulfillments(XxxOrder xxxOrder) {    return Optional.ofNullable(xxxOrder)
            .map((o) -> o.getXxxShippingInfo())            .map((si) -> si.getXxxShipmentDetails())            .map((sd) -> sd.getXxxTrackingInfo())            .map((t) -> new String[]{t.getTrackingNumber(), t.getTrackingLink()})            .orElse(null);}

写完之后,同事居然都直呼看不懂,还特地跑过来问我。。

实现原理

其实这并没有用什么高超的技术,就是利用 Java 8 Optional 来实现的,细节就不介绍了 ,主要是为了避免空指针而生的,不懂的可以点击这里查看这篇文章。

今天就来介绍下 Optional#map 方法实现这段逻辑的原理,来看下 map 的实现源码:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    // 函数式接口不能为null
    Objects.requireNonNull(mapper);    // 如果当前没有值,返回一个空的Optional
    if (!isPresent())
        return empty();
    else {
        // 如果当前有值,返回一个函数式处理该值的结果Optional
        return Optional.ofNullable(mapper.apply(value));
    }}// 判断 Optional Value 有没有值
public boolean isPresent() {    return value != null;
}// 创建一个 Optional,可以为空
public static <T> Optional<T> ofNullable(T value) {    return value == null ? empty() : of(value);
}

所以回到这段程序:

// 根对象为空就创建一个空Optional,否则就创建一个根对象的Optional
Optional.ofNullable(xxxOrder)    // 根对象为空就直接返回空Optional,否则返回这个值的 Optional
    .map((o) -> o.getXxxShippingInfo())
    // 下面依次类推……
    .map((si) -> si.getXxxShipmentDetails())
    .map((sd) -> sd.getXxxTrackingInfo())
    .map((t) -> new String[]{t.getTrackingNumber(), t.getTrackingLink()})
    // 取不到值就返回 null
    .orElse(null);
}

也许你看完感觉还是看不懂,我承认,确实比较绕,不太好理解,这个只可意会不可言传了,多看多练就理解了。

这个的关键核心在于,调用 map 时,如果 Optional 没有值就直接返回空的 Optional,而不会调用函数式接口,所以就不会出现空指针。所以只要有一个为空,后面就取不到物流信息。

程序使用了 .xx.xx.xx 这样的链式调用,调用 map 方法就必须是 Optional,而 map 的返回结果就是 Optional。

有一个问题是,如果都为空,那不是所有的 map 都会走一遍?在这种情况下会不会影响性能?编译器是否会作优化?这个暂不可知。

另外还有一个 flatMap 方法,和 map 有什么区别呢?

我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看

 

flatMap 返回结果需要在函数式接口中封装 Optional 返回,在这里应用不太合适。

总结

很多人一直都在说有在学习 Java 8 新特性,但在我看来,大部分人并没有什么实践,用的都还是最原始的实现方式。

其实我个人是一直在努力学习这方面的知识的,最新的我已经学到 Java 14 了,之前也陆续分享了一系列新特性文章。

所以我现在虽然是个老前浪了,但在新知识学习和掌握上面,我感觉已经走到了很多后浪前面。

最后

大家看完有什么不懂的可以在下方留言讨论.
谢谢你的观看。
觉得文章对你有帮助的话记得关注我点个赞支持一下!

VMware系列:此平台不支持虚拟化 Intel-VT-x/EPT 或 AMD-V/RVI 阅读详情

相关推荐

AutoGenTestCase - AI大模型生成测试用例

AI技术助力高效软件测试:AutoGenTestCase工具介绍 传统手工测试存在效率低、覆盖不全等痛点。AutoGenTestCase工具集成DeepSeek、通义千问等AI大模型,能快速解析需求并自动生成标准化测试用例,将数小时工作缩短至分钟级。该工具部署简单,仅需配置APIKey即可运行,支持多种测试用例类型比例设置,并输出Markdown和Excel格式的测试用例。通过GitHub或网盘下载后,用户可按照教程完成APIKey配置、需求文档上传和用例生成等操作,显著提升测试效率与覆盖完整性。

YIqifeibaQI的博客 348

新人入职公司

新人入职公司 前三天或者一周,不会开发,配置环境 经验: 把自己常用的开发工具和安装文件要云储备和备份,能够快速搭建。 云笔记要编写,记录地址,代码,账号等参数 了解人员分布情况,谁是前段谁是后台,公司会介绍 了解项目团队的项目情况 项目进度,自己的位置 核心业务,具体做什么 了解项目产品,看文档,使用现有的项目流程。让别人演示一下 会简单的操作和使用现在的产品去看项目的结构代码 项目首先看结构是传统项目,还是多maven,还是微服务模块的划分,工具类目录,项目的核心配置 不要去一开始

Zls10的博客 986

Kali使用Metasploit内、外网渗透windows系统

Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了。 一、(内网渗透)内网英文缩写WAN;内网又称局域网 局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网...

QQ670663的博客 2万+

为什么 80% Java 新手卡在业务逻辑?AI 代码生成工具实测解忧

当用户输入 “开发一个在线考试系统,包含用户注册登录、试卷生成、自动判分功能”,它能快速拆解需求,识别出 “用户模块”“试卷模块”“判分模块” 等核心业务点,并自动关联相应的技术方案,如使用 Spring Security 实现权限控制、MyBatis-Plus 操作数据库等。它不仅解决了新手在开发过程中的实际困难,更通过提供高质量的代码模板,帮助新手学习和掌握正确的开发思路与规范,真正实现了快速上手 Java 开发,为 Java 开发者的成长之路注入了强大动力。合理添加注释和日志,方便新手理解代码逻辑;

CalEx_Tech的博客 623

八股已死、场景当立(Docker篇)

本文总结了Docker相关的面试八股文,重点介绍了Docker在Java开发中的应用。主要内容包括:Docker容器与虚拟机的区别及其对Java应用性能的影响;如何为Java应用构建优化镜像;Docker常用命令在Java容器管理中的使用;Docker网络模式与数据卷在Java微服务中的配置;使用Docker Compose部署Java+MySQL微服务的方法;以及为Java应用配置健康检查的重要性。文章还通过具体示例说明了Nginx容器挂载、日志收集等常见场景的实现方式,为Java开发者提供了实用的Doc

qq_55253420的博客 714

Python实战:高效稳定采集微信视频号评论的API爬虫方案

网络爬虫是数据采集领域的核心技术,其原理是通过程序模拟浏览器行为,向目标服务器发送HTTP请求并解析响应数据,从而自动化获取网页或接口中的信息。这项技术的核心价值在于能够高效、批量化地收集公开数据,为市场分析、舆情监控和竞品研究提供数据基础。在社交媒体分析、电商价格监控等应用场景中,爬虫技术尤为重要。针对微信视频号这类动态加载的复杂应用,传统的GUI自动化工具(如影刀RPA)常面临性能瓶颈和风控挑战。本文聚焦于通过Python实现**无感采集**,直接与后端**API接口**交互,构建稳定高效的评论数据采集

weixin_30899023的博客 328

加入新公司,怎样快速熟悉业务和项目?

很多新人进入一家新公司后,最头疼的就是如何快速了解公司的业务和项目架构,或者说不要求快速,即便有足够的时间,也很难在庞大的业务中整理出思绪。当然,如果你碰到一个特别热心的老员工,事无巨细地给你讲,随时在你身边答疑解惑,那可能还好。但很可惜,我没有碰到这样的人,在加入新公司后,带我的人几乎没花时间给我讲项目,也没给我安排可以熟悉项目的任务。就这样的一个多月时...

xingduan5153的博客 1万+

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6934

java入职新公司如何快速熟悉和看懂代码建议!

如:新人java入职新公司一脸懵逼,不知从何下手,不知如何融入项目,也不知道如何看项目问题 我这几年待过一些公司,最近入职了一下新公司,闲来没事,发现网上有很多小白去新公司,不知从何下手,导致劝退,或者很慌的。 说说我的一些建议和一些个人经验吧 项目都不知道是干什么的,千万不要一开始就选择看代码看技术,项目的技术往往是结合业务相关联的。 1.公司入职java,前3天或前一周,正常来说是不会接手开始做项目。达环境配启动项目,不要浪费太多时间,最多半天,以前有个同事搭个环境要...

m0_37946870的博客 7044

用Python+OpenCV搞定线激光相机标定:从棋盘格到3D点云的保姆级实战

本文详细介绍了使用Python和OpenCV进行线激光相机标定的全流程实战,从硬件准备到3D点云重建。涵盖相机内参标定、激光平面方程拟合、三维重建等关键技术,提供完整的代码实现和工程优化建议,帮助开发者实现毫米级精度的工业检测和三维测量系统。

weixin_29227425的博客 284

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4054

作为新入职的Java程序员,完全看不懂公司代码,我只能...

有人说JAVA工资高、待遇好这事是一个谣言,其实这并不是谣言,事实就是如此! 最近在知乎上,看到一位蚂蚁金服的Java工程师分享,985硕士,校招就拿到了30w的offer。群内也有群友分享,自己通过三年的奋斗,终于年薪70w。这让很多同龄人羡慕,但是羡慕的同时,他们做对了哪些事?我们今天重点分享三件事: 1、Java为什么可以得到如此高的薪酬 2、Java薪酬和未来前景剖析 3、Java学习路线分享 Java应用领域广泛,还是先来看一下Java可以做什么: 1、网页开发。大到国家级

weixin_42097508的博客 5314

ADS基础教程22 - 有限元电磁仿真(FEM)

一、引言二、FEM操作过程1.新建Layout1.新建Layout2.EM设置3.设置Frequency plan4.设置Output plan5.设置Options6.设置网格频率7.仿真结果三、总结介绍了在ADS中如何进行FEM仿真过程。END!}}END!

XZ_ZC的博客 2580

我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传。 而第三方接口返回的数据是 JSON 格式的,其中物流信息却藏的十分深,如下面所示,JSON 节点是这样的: xxxOrder > xxxShippingInfo > xxxShipmentDetails > xxxTrackingInfo > trackingNumber, trackingLink 基本实现 因为第三方接口返回的

Java技术栈,分享最主流的Java技术 904

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

我用-Java-8-写了一段逻辑,同事直呼看不懂,你试试看!

很多人一直都在说有在学习 Java 8 新特性,但在我看来,大部分人并没有什么实践,用的都还是最原始的实现方式。其实我个人是一直在努力学习这方面的知识的,最新的我已经学到 Java 14 了,之前也陆续分享了一系列新特性文章,所以我现在虽然是个老前浪了,但在新知识学习和掌握上面,我感觉已经走到了很多后浪前面。##最后大家看完有什么不懂的可以在下方留言讨论.原文链接:Java技术栈知识学习和掌握上面,我感觉已经走到了很多后浪前面。##最后。

2401_87167787的博客 1427

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

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

我用-Java-8-写了一段逻辑,同事直呼看不懂,你试试看!(1)

很多人一直都在说有在学习 Java 8 新特性,但在我看来,大部分人并没有什么实践,用的都还是最原始的实现方式。其实我个人是一直在努力学习这方面的知识的,最新的我已经学到 Java 14 了,之前也陆续分享了一系列新特性文章,关注一下吧!**[外链图片转存中…(img-3ZWP5JRf-1714708556351)][外链图片转存中…(img-D2ZwxR01-1714708556351)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2401_84102759的博客 91

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IntelliJ IDEA 调试 Java 8 Stream,实在太香了!

前段时间,栈长发布了一篇关于 Java 8 Optional.map 的实用文章,留言区就有的人说 Java 8 的语法糖不方便调试,还要视情况使用。 留言区也有人说 IntelliJ IDEA 早已支持 Java 8 Stream 调试,因为我平时也很少调试,那么我就以 IntelliJ IDEA 来演示下如何调试 Java 8 中的 Stream 链式调用吧。 先写一段 Java 8 Stream 示例: /* * 来源公众号:Java技术栈 */ public static void main(S

Java技术栈,分享最主流的Java技术 4279

Java 8 中的抽象类和接口到底有啥区别?

上一篇栈长发了这篇《Java 8 有多牛逼?打破一切你对接口的认知!》,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇: 在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就 OUT 啦,要跟上形式。 这个问题我在面试一个 39 岁的程序员时,他居然也没回答上来,其实了解 Java 8 的同学应该都知道,Java 8 在接口中推出了默认方法、静态方法,打破了接口只能写抽象方

Java技术栈,分享最主流的Java技术 701

不敢相信!JDK 8 的 HashMap 依然会死循环…

是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题。 然而事实并非如此。少年可曾了解一种红黑树成环的场景,=v= 今日在查看监控时候发现,某一台机器load飙升 感觉问题不对劲,ssh大法登陆机器,top,top -Hp,jstack,jmap四连击保存下来堆栈,cpu使用最高的线程,内存信息准备分析。 首先查看使用最耗费cpu的线程堆栈信息 cat stack | grep -i 34670 -C10 --col

Java技术栈,分享最主流的Java技术 382

String.format() 图文详解,写得非常好!

作者:潘佳琦 链接:https://segmentfault.com/a/1190000019350486 引言 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言应该记得C语言的sprintf()方法,两者有类似之处。 format()方法有两种重载形式。 重载 // 使用当前本地区域对象(Locale.getDefault()),制定字符串格式和参数生成格式化的字符串 String String.format(String fmt, Object... ar.

Java技术栈,分享最主流的Java技术 2669

推荐一款 IDEA 神器 ,人工智能帮你写代码,再也不用加班了!!

今天栈长给大家推荐一款代码神器,人工智能帮你写代码,简直爽的不行,关键还是免费的,一起来看看。 简介 Codota 是一款优秀的 AI 代码自动完成工具,可以帮助我们极大的提高开发效率。 官网:https://www.codota.com/ 支持主流语言: Java, Javascript, TypeScript, Python, PHP, Go, Ruby, C, C++, Rust, C# …… 支持主流开发工具: 代码私有: Codota 不会将代码发送到 Codota 服务器,只会从当前编辑的

Java技术栈,分享最主流的Java技术 2034

Java内存泄漏介绍

内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。 本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。 什么是内存泄漏? 内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。 为了理解这个定义,我们需要了解对象在内存中的状态。下图说明了什么是未引用的,什么是引用的对象。 从图中可以看出,有被引用的对象和未被引用的对象。未引用的对象将被垃圾收集,而被引用的对

Java技术栈,分享最主流的Java技术 452

卧槽!最新编程语言排名,Java 沦为老二。。

2020 年 9 月刚过去,栈长看了下最新的 tiobe 编程语言榜,牛逼啊,C 语言居然登顶了,Java 下降 3 个点,沦为老二的位置。 数据来源TIOBE: https://www.tiobe.com/tiobe-index/ TIOBE介绍: TIOBE编程语言索引是编程语言流行程度的一个参考指标,这个索引每月更新一次。 编程语言评级是根据全球软件工程师的数量、课程和第三方供应商进行的。还有流行的搜索引擎,比如:谷歌,Bing, Yahoo 等,维基百科、亚马逊、YouTube和百度也包含其

Java技术栈,分享最主流的Java技术 1285

Redis 6.0.8 紧急发布,请尽快升级!

大家周末愉快啊,今天分享一则重要通知。 Redis 6.0.8 于 2020/9/10 日晚紧急发布!!! 可以看到这是一个紧急更新版本,使用了 Redis 6.0.7 Sentinel(哨兵)以及 CONFIG REWRITE 命令的用户受到影响,请尽快升级,参考问题:#7760。 https://github.com/redis/redis/issues/7760 Redis 6.0.8 发布邮件: https://groups.google.com/g/redis-db/c/Wmf0RB25

Java技术栈,分享最主流的Java技术 869
上一篇: 秋招进大厂很难?那来参考下这个网约车实战项目吧!
下一篇: 本以为自己MySQL够牛逼了,直到亲自去阿里受虐了一次!
Java斗帝之路
博客等级 码龄7年 2392粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值