Java8 Optional常用方法使用场景分析

 更新时间:2024年06月15日 09:16:02   作者:涛哥是个大帅比  
这篇文章主要介绍了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;				//   id
	private 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;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java继承超详细教程

    Java继承超详细教程

    继承是面向对象语法的三大特征之一,继承可以降低代码编写的冗余度,提高编程的效率,通过继承,子类获得了父类的成员变量和方法,一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢,今天我们开始学习有关Java继承的知识,感兴趣的朋友一起看看吧
    2023-11-11
  • 详解Spring的StringUtils踩坑记录

    详解Spring的StringUtils踩坑记录

    这篇文章主要介绍了详解Spring的StringUtils踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Java实现AOP代理的三种方式详解

    Java实现AOP代理的三种方式详解

    AOP是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善。本文将用Java实现AOP代理的三种方式,需要的可以参考一下
    2022-07-07
  • Java探索之Hibernate主键生成策略详细介绍

    Java探索之Hibernate主键生成策略详细介绍

    这篇文章主要介绍了Java探索之Hibernate主键生成策略详细介绍,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java中BigInteger用法小结

    Java中BigInteger用法小结

    这篇文章主要介绍了Java中BigInteger用法的详解,在这里,我们详细描述下BigInteger的用法,在使用之前,我们需要导入java.math.*包,本文通过实例代码相结合给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • java简易小游戏制作代码

    java简易小游戏制作代码

    这篇文章主要介绍了java简易小游戏制作代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Linux下Hadoop 2.7.3 安装搭建过程

    Linux下Hadoop 2.7.3 安装搭建过程

    Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS,这篇文章给大家介绍Linux下Hadoop 2.7.3 安装搭建过程,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • Spring Cloud Feign内部实现代码细节

    Spring Cloud Feign内部实现代码细节

    Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。接下来通过本文给大家分享Spring Cloud Feign内部实现代码细节,感兴趣的朋友一起看看吧
    2021-05-05
  • SpringDataRedis简单使用示例代码

    SpringDataRedis简单使用示例代码

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • SpringBoot添加富文本编辑器操作步骤

    SpringBoot添加富文本编辑器操作步骤

    富文本编辑器是一种能够编辑和展示富文本内容的工具或程序,与纯文本编辑器不同,富文本编辑器可以处理文本的格式、样式、布局等方面,使文本更加丰富多样,本文给大家介绍了SpringBoot添加富文本编辑器操作步骤,需要的朋友可以参考下
    2024-01-01

最新评论