成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何正確使用Java8的Optional機制

開發 后端
Java8帶來的函數式編程特性對于習慣命令式編程的程序員來說還是有一定的障礙的,我們只有深入了解這些機制的方方面面才能運用自如。

Java8帶來的函數式編程特性對于習慣命令式編程的程序員來說還是有一定的障礙的,我們只有深入了解這些機制的方方面面才能運用自如。Null的處理在JAVA編程中是出了try catch之外的另一個頭疼的問題,需要大量的非空判斷模板代碼,程序邏輯嵌套層次太深。尤其是對集合的使用,需要層層判空。

首先來看下Optional類的結構圖:

 

1,Optional擁有兩個字段

  1. /** 
  2.      * Common instance for {@code empty()}. 
  3.      */ 
  4.     private static final Optional<?> EMPTY = new Optional<>(); 
  5.  
  6.     /** 
  7.      * If non-null, the value; if null, indicates no value is present 
  8.      */ 
  9.     private final T value;  

1)EMPTY持有某個類型的空值結構,調用empty()返回的即是該實例

  1. public static<T> Optional<T> empty() { 
  2.         @SuppressWarnings("unchecked"
  3.         Optional<T> t = (Optional<T>) EMPTY; 
  4.         return t; 
  5.     }  

2)T vaule是該結構的持有的值

2,Optional的方法

1)構造函數

  1. private Optional() { 
  2.         this.value = null
  3.     } 
  4. private Optional(T value) { 
  5.         this.value = Objects.requireNonNull(value); 
  6.     }  

Optional(T value)如果vaule為null就會拋出NullPointer異常,所以對于使用的場景這兩個構造器都適用.

2)生成Optional對象

有兩個方法 of(T)和ofNullable(T)

  1. public static <T> Optional<T> of(T value) { 
  2.         return new Optional<>(value); 
  3.     } 
  4.  
  5.  public static <T> Optional<T> ofNullable(T value) { 
  6.         return value == null ? empty() : of(value); 
  7.     }  

of是直接調用的構造函數,因此如果T為null則會拋出空指針異常

ofNullable對null進行了處理,會返回EMPTY的實例,因此不會出現異常

所以只有對于明確不會為null的對象才能直接使用of

3)獲取Optional對象的值

需要擯棄的使用方式

if(value.isPresent){

....

}else{

T t = value.get();

}

這種使用方式無異于傳統的if(vaule != null)

正確的使用姿勢:

orElse:如果值為空則返回指定的值

orElseGet:如果值為空則調用指定的方法返回

orElseThrow:如果值為空則直接拋出異常

  1. public T orElse(T other) { 
  2.         return value != null ? value : other; 
  3.     } 
  4.  
  5.     public T orElseGet(Supplier<? extends T> other) { 
  6.         return value != null ? value : other.get(); 
  7.     } 
  8.  
  9.     public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { 
  10.         if (value != null) { 
  11.             return value; 
  12.         } else { 
  13.             throw exceptionSupplier.get(); 
  14.         } 
  15.     }  

一般我們使用orElse來取值,如果不存在返回默認值.

4)Optional的中間處理

filter,map,flatMap,這幾個操作跟Stream的處理類似,只是要注意flatMap處理必須手動指定返回類型為Optional<U>,而map會自動將返回值包裝成Optional.舉個栗子,我們有商品很訂單的結構:

  1. package model; 
  2.  
  3. import java.util.List; 
  4.  
  5. /** 
  6.  * @auth gongxufan 
  7.  * @Date 2017/10/23 
  8.  **/ 
  9. public class Goods { 
  10.     private String goodsName; 
  11.     private double price; 
  12.     private List<Order> orderList; 
  13.  
  14.     public String getGoodsName() { 
  15.         return goodsName; 
  16.     } 
  17.  
  18.     public void setGoodsName(String goodsName) { 
  19.         this.goodsName = goodsName; 
  20.     } 
  21.  
  22.     public double getPrice() { 
  23.         return price; 
  24.     } 
  25.  
  26.     public void setPrice(double price) { 
  27.         this.price = price; 
  28.     } 
  29.  
  30.     public List<Order> getOrderList() { 
  31.         return orderList; 
  32.     } 
  33.  
  34.     public void setOrderList(List<Order> orderList) { 
  35.         this.orderList = orderList; 
  36.     } 
  37.  
  1. package model; 
  2.  
  3. import java.time.LocalDateTime; 
  4.  
  5. /** 
  6.  * @auth gongxufan 
  7.  * @Date 2017/10/23 
  8.  **/ 
  9. public class Order { 
  10.     private LocalDateTime createTime; 
  11.     private LocalDateTime finishTime; 
  12.     private String orderName; 
  13.     private String orderUser; 
  14.  
  15.     public LocalDateTime getCreateTime() { 
  16.         return createTime; 
  17.     } 
  18.  
  19.     public void setCreateTime(LocalDateTime createTime) { 
  20.         this.createTime = createTime; 
  21.     } 
  22.  
  23.     public LocalDateTime getFinishTime() { 
  24.         return finishTime; 
  25.     } 
  26.  
  27.     public void setFinishTime(LocalDateTime finishTime) { 
  28.         this.finishTime = finishTime; 
  29.     } 
  30.  
  31.     public String getOrderName() { 
  32.         return orderName; 
  33.     } 
  34.  
  35.     public void setOrderName(String orderName) { 
  36.         this.orderName = orderName; 
  37.     } 
  38.  
  39.     public String getOrderUser() { 
  40.         return orderUser; 
  41.     } 
  42.  
  43.     public void setOrderUser(String orderUser) { 
  44.         this.orderUser = orderUser; 
  45.     } 
  46.  

現在我有一個goodsOptional

  1. Optional<Goods> goodsOptional = Optional.ofNullable(new Goods()); 

現在我需要獲取goodsOptional里邊的orderList,應該這樣你操作

  1. goodsOptional.flatMap(g ->Optional.ofNullable(g.getOrderList())).orElse(Collections.emptyList()) 

flatMap里頭返回的是Optional<List<Order>>,然后我們再使用orElse進行unwraap.因此faltMap可以解引用更深層次的的對象鏈.

5)檢測Optional并執行動作

  1. public void ifPresent(Consumer<? super T> consumer) { 
  2.         if (value != null
  3.             consumer.accept(value); 
  4.     }  

這是一個終端操作,不像上邊的可以進行鏈式操作.在Optional實例使用直接調用,如果value存在則會調用指定的消費方法.舉個栗子:

  1. Goods goods = new Goods(); 
  2.  Optional<Goods> goodsOptional = Optional.ofNullable(goods); 
  3.  List<Order> orderList = new ArrayList<>(); 
  4.  goods.setOrderList(orderList); 
  5.  goodsOptional.flatMap(g ->Optional.ofNullable(g.getOrderList())).ifPresent((v)-> System.out.println(v));  

至此該類的方法和使用介紹都差不多了,最后總結需要注意的地方:

1)Optional應該只用處理返回值,而不應該作為類的字段或者方法的參數.因為這樣會造成額外的復雜度.

2)使用Option應該避免直接適應構造器和get,而應該使用isElse的系列方法避免頻繁的非空判斷

3)map和flatMap要注意區分使用場景 

責任編輯:龐桂玉 來源: 吹著空調蓋被子的博客
相關推薦

2023-01-09 11:45:21

Java8Optional系統

2021-01-04 08:39:26

JAVA8OptionalNPE

2024-01-31 08:53:01

Java數組代碼

2020-12-01 07:18:35

Java8日期時間

2015-03-31 14:15:12

JavaJava事件通知

2023-05-12 07:40:01

Java8API工具

2022-07-11 10:51:25

Java 8OptionalNPE

2010-02-03 15:40:37

Python函數

2019-11-14 16:23:07

MySQL索引數據庫

2017-09-23 15:28:32

JavaOptional方法

2017-10-25 11:05:14

Java

2020-07-24 08:11:04

Java8ava5語言

2020-12-29 05:34:48

Scrapy網頁源代碼

2022-09-07 08:58:58

Node.js框架

2018-12-05 09:00:00

RedisRedis Strea數據庫

2014-04-11 12:49:00

Java8Java8教程

2015-09-30 09:34:09

java8字母序列

2020-10-10 11:07:38

Java開發代碼

2014-07-16 16:42:41

Java8streamreduce

2014-04-15 09:40:04

Java8stream
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线播放 | 免费成人av | 国产网站在线免费观看 | 亚洲欧美精品久久 | 欧美视频三区 | 亚洲精品观看 | 一区二区三区av | 日本午夜精品一区二区三区 | 99精品视频在线观看 | 精品综合视频 | 日韩一区二区黄色片 | 亚州无限乱码 | 亚洲精品一区国产精品 | 午夜精品一区 | 日本黄色免费片 | www.日韩 | 男人的天堂亚洲 | 欧美一区二区三区视频 | 一区二区三区高清 | 欧美久久久网站 | 美女日批免费视频 | 国产午夜精品一区二区三区嫩草 | 国产精品18hdxxxⅹ在线 | 欧美三级三级三级爽爽爽 | 亚洲一区二区三区福利 | 91精品国产91久久久久久不卞 | 精品国产伦一区二区三区观看体验 | 国产免费播放视频 | 欧美一级精品片在线看 | 久久久久国产一区二区三区 | 国产在线二区 | 9久久精品| 涩涩视频网站在线观看 | 凹凸日日摸日日碰夜夜 | 国产精品久久久久aaaa九色 | 国产精品精品久久久 | 91中文 | 可以在线观看av的网站 | 日韩一区二区三区视频 | 91久久电影 | 日韩欧美在线精品 |