Java8 Optional常用方法使用场景

前言:

        Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllection)。

        为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口(如:Predicate、Consumer、Function、Supplier)参数。


项目场景:

  业务需求是这样的,从第三方拉取用户信息,然后保存到公司自己的数据库,而第三方接口返回的数据是 JSON 格式的,需要获取到用户地址相关信息,但是用户地址相关信息却藏的十分深,如下面所示,JSON 节点是这样的:

{"userInfo":{"userDetails":{"city":"深圳市"}}}

基本实现

创建相关实体用来接收

import lombok.Data;@Data
public class User {private Integer id;				//   idprivate UserInfo userInfo;		//   用户信息public User(UserInfo userInfo) {this.userInfo = userInfo;}
}
import lombok.Data;@Data
public class UserInfo {private String userName;			//   用户名称private UserDetails userDetails;	//   用户详情public UserInfo(UserDetails userDetails) {this.userDetails = userDetails;}
}
import lombok.Data;@Data
public class UserDetails {private String address;			//   住址private String city;			//   城市public UserDetails(String city) {this.city = city;}
}

示例代码:

1.常用的写法

缺点:if嵌套非常深

import com.test.entity.User;
import com.test.entity.UserDetails;
import com.test.entity.UserInfo;import java.util.Optional;public class TestService {public static void main(String[] args) {UserDetails userDetails = new UserDetails("深圳市");UserInfo userInfo = new UserInfo(userDetails);User user = new User(userInfo);System.out.println(getCity(user));}/*** 以前的写法* @param user  用户对象* @return  用户所在城市*/public static String getCity(User user){if(user != null){UserInfo userInfo = user.getUserInfo();if(userInfo != null){UserDetails userDetails = userInfo.getUserDetails();if(userDetails != null){return userDetails.getCity();}}}return null;}
}

2.JAVA8写法

优点:不用再额外判断空指针

import com.test.entity.User;
import com.test.entity.UserDetails;
import com.test.entity.UserInfo;import java.util.Optional;public class TestService {public static void main(String[] args) {UserDetails userDetails = new UserDetails("深圳市");UserInfo userInfo = new UserInfo(userDetails);User user = new User(userInfo);System.out.println(getCity_java8(user));}/*** java8写法* @param user  用户对象* @return  用户所在城市*/public static String getCity_java8(User user){return Optional.ofNullable(user).map(u -> u.getUserInfo()).map(d -> d.getUserDetails()).map(t -> t.getCity()).orElse(null);}
}

源码解析:

为什么Optional不用判断空指针了呢,其实这并没有用什么高超的技术,看源码可以发现其实是它已经帮我们处理好了

1.映射元素(map)

//将 T 类型元素映射为 U 类型元素
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}
}

 2.创建容器(ofNullable)

 public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}

3.容器判空(isPresent) 

// 判断 Optional Value 有没有值
public boolean isPresent() {return value != null;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wpf 使用 Prism 实战开发Day23

自定义对话框服务 当原有对话框不能满足需求的时候&#xff0c;可以通过自定义对话框来实现特殊的需求 一.自定义对话框主机服务步骤&#xff1a; 1.建立一个IDialogHostService 接口类&#xff0c;继承自 IDialogService 对话框服务类。并且自定义基类的服务方法。 public …

mac电脑安装python的spacy

打开终端&#xff1a;你可以通过在Finder中打开应用程序 > 实用工具 > 终端&#xff0c;或者使用Spotlight搜索终端来打开它。 确认Python环境&#xff1a;在安装spacy之前&#xff0c;确认你使用的Python环境。如果你有多个Python版本&#xff0c;确保你使用的是正确的…

Java - Scanner类

Scanner类 scanner 是 Java 中的一个类。类是一个构造块&#xff0c;它定义了创建某些类型的对象&#xff08;实例&#xff09;时它们的属性和行为。在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;类可以视为创建对象的模板或蓝图&#xff0c; Scanner 类属于 jav…

【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别

目录&#xff1a; 目录 目录&#xff1a; 一、Socket原理与TCP/IP协议 1.1 Socket概念&#xff1a; 1.2 建立Socket连接&#xff1a; 1.3 SOCKET连接与TCP/IP连接 二、HTTP连接&#xff1a; 2.1 HTTP原理 三、三者的区别和联系 前些天发现了一个巨牛的人工智能学习网站&#xf…

markdown 文件渲染工具推荐 obsidian publish

背景 Markdown 是一种轻量级的标记语言&#xff0c;最开始使用它是觉得码字非常方便&#xff0c;从一开始的 word 排版到 markdown &#xff0c;还不太不习惯&#xff0c;用了 obsidian把一些文字发在网上后&#xff0c;才逐渐发现他的厉害之处。 让人更加专注于内容本身&…

转行java浅谈就业前景

Java市场环境 国内的一线、二线和三线城市都有着不同的就业环境&#xff1a; 一线城市&#xff08;如北京、上海、广州、深圳&#xff09;&#xff1a; 一线城市通常拥有最多的高科技公司和互联网企业总部&#xff0c;因此在这些城市&#xff0c;Java开发者通常有更多的就业…

[leetcode]字符串消除连续出现3次及以上的字符

#include <iostream> #include <string> using namespace std;void del(string &s) {int i0,j0;while(i<s.size()){ji;while(j<s.size() && s[j]s[i]){j;}if(j-i>3){s.erase(i,j-i);//消除重复的i0;}elsei;} }

C语言 浮点数 打印的方法

一、方式1 在C语言中&#xff0c;浮点数&#xff08;通常包括 float 和 double 类型&#xff09;的打印是通过标准库中的 printf 函数完成的。为了正确地打印浮点数&#xff0c;需要使用格式说明符来指定如何格式化输出。 #include <stdio.h> int main(void) { floa…

体量小但增速快,国内OTA平台与国际巨头差在哪?

5月3日&#xff0c;Booking、Expedia等国际OTA平台相继发布2024年第一季度财报。5月21日&#xff0c;携程发布2024年第一季度财报。至此&#xff0c;国内外主要OTA平台一季度成绩单均已披露。 受益于全球旅游市场复苏&#xff0c;三家OTA平台一季度营收同比均正向增长。增长之…

03-ArcGIS For JavaScript结合ThreeJS功能

ArcGIS For JavaScript结合ThreeJS功能 概述three.js中功能实现externalRenderers&#xff08;4.28及以下版本&#xff09;RenderNode&#xff08;4.29版本&#xff09; 概述 ArcGIS For Javacript提供了一些对象可以支持加载webgl上下文信息&#xff0c;这里包括webgl编程的代…

基于jeecgboot-vue3的Flowable增加流程支持组件与element-plus组件导入支持

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、package.json文件需要增加相关流程组件&#xff0c;如下 "dependencies": {"element-plus/icons-vue": "^2.3.1","highlightjs/vue-plugin":…

蔬菜水果店做配送分销小程序的作用是什么

蔬菜水果是人们生活必需&#xff0c;传统为线下市场、超市、路边小摊等场景购买&#xff0c;如今快节奏时代&#xff0c;用户需要更快完成消费、商家也需要摆脱竞争获客转化以及提升自己的运营能力。 蔬菜水果隔三岔五或每天都会购买&#xff0c;老客粘性较高&#xff0c;还需…

文字生成图像内容解决方案,享受创作的乐趣

企业对于内容创新和视觉呈现的需求日益增强&#xff0c;美摄科技凭借其卓越的技术实力&#xff0c;推出了一款面向企业的文字生成图像内容解决方案。通过该方案&#xff0c;企业能够轻松将文字内容转化为高质量的图像&#xff0c;实现内容创作的全新突破。 一、车机语音交互&a…

【漏洞复现】懒人网址导航页 search.html SQL注入漏洞

0x01 产品简介 赖人网址导航系统是一种智能化的网址导航平台&#xff0c;旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能&#xff0c;能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时&#xff0c;系统还提供了网址分类、网址收藏和网…

Java-----Stream

前言: Stream流是Java 8引入的功能&#xff0c;用于高效处理数据集合。它提供了丰富的操作方法&#xff0c;如过滤、映射、排序等&#xff0c;以简洁的方式处理数据。Stream流具有流式操作、懒执行和内部迭代的特点&#xff0c;能够简化代码并提高可读性。在接下来的文章中&am…

高仿百度网页(附带源码)

高仿百度网页 效果图部分源码及素材领取源码下期更新预报 效果图 部分源码及素材 <script language"javascript">function show_date_time() {window.setTimeout("show_date_time()", 1000);BirthDay new Date("1/20/2023 16:52:21");//…

OpenMV学习笔记1——IDE安装与起步

目录 一、OpenMV IDE下载 二、OpenMV界面 三、Hello World&#xff01; 四、将代码烧录到OpenMV实现脱机运行 五、插SD卡&#xff08;为什么买的时候没送&#xff1f;&#xff09; 一、OpenMV IDE下载 浏览器搜索OpenMV官网&#xff0c;进入后点击“立即下载”&#xff0…

nodejs实现生成加密zip压缩包,封装成一个vite插件

实现生成加密zip压缩包的nodejs脚本 pnpm i -D archiver archiver-zip-encryptedconst { cwd } require("node:process"); const path require("path"); const fs require("fs-extra"); const archiver require("archiver");// 检…

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C进阶&#xff1a;C11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点的讲解 文章目录 1.统一的列表初始化1.1&#xff5b;&#xff5d;初始化1.2 initializer_listpair的补充 2.声明相关关键字2.1a…