最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8?Optional常用方法使用場景分析

 更新時間:2024年06月15日 09:16:02   作者:濤哥是個大帥比  
這篇文章主要介紹了Java8?Optional常用方法使用場景,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

Optional 是 Java 8 的新特性,專治空指針異常(NullPointerException, 簡稱 NPE)問題,它是一個容器類,里面只存儲一個元素(這點不同于 Conllection)。

為方便用戶通過 Lambda 表達式調(diào)用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需傳入函數(shù)式接口(如:Predicate、Consumer、Function、Supplier)參數(shù)。

項目場景:

業(yè)務需求是這樣的,從第三方拉取用戶信息,然后保存到公司自己的數(shù)據(jù)庫,而第三方接口返回的數(shù)據(jù)是 JSON 格式的,需要獲取到用戶地址相關信息,但是用戶地址相關信息卻藏的十分深,如下面所示,JSON 節(jié)點是這樣的:

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

基本實現(xiàn)

創(chuàng)建相關實體用來接收

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寫法

  • 優(yōu)點:不用再額外判斷空指針
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不用判斷空指針了呢,其實這并沒有用什么高超的技術,看源碼可以發(fā)現(xiàn)其實是它已經(jīng)幫我們處理好了

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.創(chuàng)建容器(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;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 詳解Java中自定義注解的使用

    詳解Java中自定義注解的使用

    Annontation是Java5開始引入的新特征,中文名稱叫注解,它提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類、方法、成員變量等)進行關聯(lián)。本文主要介紹了自定義注解的使用,希望對大家有所幫助
    2023-03-03
  • java基礎之 “==”與“equals”區(qū)別詳解

    java基礎之 “==”與“equals”區(qū)別詳解

    這篇文章主要介紹了java基礎之 “==”與“equals”區(qū)別詳解,需要的朋友可以參考下
    2020-02-02
  • Java使用Arrays.asList報UnsupportedOperationException的解決

    Java使用Arrays.asList報UnsupportedOperationException的解決

    這篇文章主要介紹了Java使用Arrays.asList報UnsupportedOperationException的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 關于Idea中的.properties文件顯示問題

    關于Idea中的.properties文件顯示問題

    這篇文章主要介紹了關于Idea中的.properties文件顯示問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題

    解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題

    這篇文章主要介紹了解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 如何利用Spring?MVC實現(xiàn)RESTful風格

    如何利用Spring?MVC實現(xiàn)RESTful風格

    這篇文章主要介紹了如何利用Spring?MVC實現(xiàn)RESTful風格,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SWT(JFace)體驗之Sash(活動控件)

    SWT(JFace)體驗之Sash(活動控件)

    SWT(JFace)體驗之Sash(活動控件)
    2009-06-06
  • Spring中的ApplicationContext與BeanFactory詳解

    Spring中的ApplicationContext與BeanFactory詳解

    這篇文章主要介紹了Spring中的ApplicationContext與BeanFactory詳解,Spring的IoC容器就是一個實現(xiàn)了BeanFactory接口的可實例化類,事實上, Spring提供了兩種不同的容器,一種是最基本的BeanFactory,另一種是擴展的ApplicationContext,需要的朋友可以參考下
    2024-01-01
  • 詳解SpringBoot自定義配置與整合Druid

    詳解SpringBoot自定義配置與整合Druid

    Druid是alibaba開源平臺上一個數(shù)據(jù)庫連接池實現(xiàn),結(jié)合了C3P0,DBCP等DB池的優(yōu)點,同時也有Web監(jiān)控界面。這篇文章主要介紹了Java之SpringBoot自定義配置與整合Druid的相關知識,需要的朋友可以參考下
    2021-09-09
  • Java中Struts2的值棧ValueStack詳解

    Java中Struts2的值棧ValueStack詳解

    這篇文章主要介紹了Java中Struts2的值棧ValueStack詳解,值棧(ValueStack)就是 OGNL 表達式存取數(shù)據(jù)的地方,在一個值棧中,封裝了一次請求所需要的所有數(shù)據(jù),需要的朋友可以參考下
    2023-08-08

最新評論

齐河县| 无为县| 上饶县| 靖西县| 泊头市| 寿光市| 余干县| 海城市| 阿合奇县| 棋牌| 玉门市| 白玉县| 济南市| 镇安县| 屯留县| 南开区| 芒康县| 津市市| 南陵县| 镇远县| 遵义县| 大石桥市| 湘潭县| 安陆市| 九江县| 印江| 扎兰屯市| 南康市| 嫩江县| 宁波市| 建阳市| 海林市| 屏边| 吉木乃县| 满洲里市| 凤阳县| 赤城县| 航空| 尉氏县| 永宁县| 阿拉善右旗|