日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用過Optional;那用過Try么?

本文轉(zhuǎn)載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。   

創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為萬山企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站,萬山網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

Java的Optional非常好用。我們一般使用Optional做非空處理,省去if的處理。主要的目的,就是為了解決Java中臭名昭著的空指針異常。

比如我們在平常的編碼中,經(jīng)常遇到對輸入?yún)?shù)的非空判斷。

 
 
 
 
  1. public void getXXX(Map params) { 
  2.     Map map = params; 
  3.     if (map == params) { 
  4.         map = new HashMap<>(); 
  5.     } 

這種代碼一多,我們的程序就會慢慢變成shit mountain。這個時候就可以使用Optional進行改造。

 
 
 
 
  1. public void getXXX(Map params) { 
  2.     Map map = Optional.ofNullable(params).orElse(new HashMap<>()); 

代碼行數(shù)少了,邏輯清晰,同時自己的績效也降低了 :)。

1. 復(fù)雜例子

看一個比較復(fù)雜的例子。

假如我們需要的數(shù)據(jù)層次比較深。

 
 
 
 
  1. String cityCode = customer.getAddress().getCity().getCityCode().substring(0,3); 

這樣獲取是不合理的,因為其中的某一環(huán),可能是空,會拋出空指針的。所以,我們需要一層層的進行判斷。

 
 
 
 
  1. public void getCityCode(Customer customer) { 
  2.     String cityCode = "000"; 
  3.     if (customer != null) { 
  4.         Address address = customer.getAddress(); 
  5.         if (null != address) { 
  6.             City city = address.getCity(); 
  7.             if (city != null) { 
  8.                 String code = city.getCityCode(); 
  9.                 if (null != code && code.length() >= 3) { 
  10.                     cityCode = code.substring(0, 3); 
  11.                 } 
  12.             } 
  13.         } 
  14.     } 
  15.     System.out.println(cityCode); 

使用Optional的lambda語法,我們可以把代碼改成下面這樣:

 
 
 
 
  1. public void getCityCode(Customer customer) { 
  2.     String cityCode = Optional.ofNullable(customer) 
  3.             .map(c -> c.getAddress()) 
  4.             .map(a -> a.getCity()) 
  5.             .map(c -> c.getCityCode()) 
  6.             .filter(s -> s.length() >= 3) 
  7.             .map(s -> s.substring(0, 3)) 
  8.             .orElse("000"); 

代碼是不是顏值很高?

顏值雖高,下面還是要點一些偏門的重點內(nèi)容。

2. Optional的隱秘內(nèi)容

其實,早在Java8發(fā)布之前(2014),guava就有了類似的工具,但由于當(dāng)時并沒有l(wèi)ambda語法,所以只能做些簡單的應(yīng)用。

Guava的optional支持序列化,可以在RPC框架方法中返回,但是一般很少用。

Java的Optional卻根本無法序列化。為什么java8的Optional沒有實現(xiàn)序列化,這里有個討論,可以看看http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-September/003186.html

另外Java8比Guava多了ifPresent、map、 filter、 flatMap、 orElseThrow這些方法。鑒于現(xiàn)在使用Guava Optional的人越來越少,不提也罷。

Optional會對GC有一定壓力,如果開發(fā)底層框架,還是慎重使用,netty就曾經(jīng)過測試,最后放棄了Optional。

但我還是喜歡用。誰讓國內(nèi)大多數(shù)都是cruder呢?

3. Try為何物?

長期使用使用Java編碼的Javaer,在見了Scala、Kotlin一類的語言后,會有一種驚艷的感覺。但這些包實在是太大了,引入有一定的成本,只能眼巴巴的饞她們的身子。

但是,Java 標(biāo)準(zhǔn)庫對函數(shù)式編程的 API 支持相對比較有限。有沒有一種輕量級的方式,來增強我們的Java庫呢?要是能和Lambda表達式結(jié)合起來,那就更妙了。Vavr就是這樣一個簡單的Jar包,讓我們的代碼,寫起來更加流暢。

它的maven坐標(biāo)是:

 
 
 
 
  1.  
  2.     io.vavr 
  3.     vavr 
  4.     0.10.3 
  5.  

下面是一段偉大的睡眠排序法的代碼:

 
 
 
 
  1. public class SleepSort implements Runnable { 
  2.     private int num; 
  3.     public SleepSort(int num) { 
  4.         this.num = num; 
  5.     } 
  6.     @Override 
  7.     public void run() { 
  8.         try { 
  9.             Thread.sleep(num * 10); 
  10.         } catch (Exception e) { 
  11.             e.printStackTrace(); 
  12.         } 
  13.         System.out.print(num + " "); 
  14.     } 
  15.     public static void main(String[] args) { 
  16.         int[] nums = {5, 22, 10, 7, 59, 3, 16, 4, 11, 8, 14, 24, 27, 25, 26, 28, 23, 99}; 
  17.         Arrays.stream(nums).forEach(n->new Thread(new SleepSort(n)).start()); 
  18.     } 

其中的Run部分,太多無用的信息,我們可以使用Try來改造。

我們可以簡化為下面兩行:

 
 
 
 
  1. Try.run(()->Thread.sleep(num*10)) 
  2.         .andThen(()->System.out.print(num + " ")); 

它支持非常多的方法,可以完成大多數(shù)后續(xù)的業(yè)務(wù)處理。比如,在onFailure方法里,加入對異常信息的日志記錄。

而常見的jackson json的處理,可以簡化成下面的代碼:

 
 
 
 
  1. String json = Try.of(() -> objectMapper.writeValueAsString(str)).getOrElse("{}"); 

Try就是這么好用。最重要的是,vavr的大小只有800多kb。

4. vavr的更多操作

vavr支持Tuple(元組)、Option、Try、Either、集合便捷操作、多元函數(shù)、柯里化方法(curring)等。

可以看一下vavr版本的if else。下面是四個分支的代碼。里面這些奇怪的符號,證明它也只是語法糖。

 
 
 
 
  1. public String vavrMatch(String input) { 
  2.     return Match(input).of( 
  3.             Case($("a"), "a1"), 
  4.             Case($("b"), "b2"), 
  5.             Case($("c"), "c3"), 
  6.             Case($(), "unknown") 
  7.     ); 

再比如,你想要定義一個函數(shù),而不是一個類,在Java中可以使用Function。但可惜的是,Java的Function只支持一個參數(shù)。

使用Vavr的Function,最多支持22個參數(shù)!

再比如,你想要在一個方法中,返回多個值。這個,在python中很容易實現(xiàn),在Java中就不得不定義一個Class去接收。

元組,就可以支持多個返回值的組合。比如下面的代碼:

 
 
 
 
  1. // (Java, 8) 
  2. Tuple2 java8 = Tuple.of("Java", 8);  
  3.  
  4. // "Java" 
  5. String s = java8._1;  
  6.  
  7. // 8 
  8. Integer i = java8._2;  

vavr支持一次性返回8個值。

另外,還有l(wèi)azy等小工具。比如延遲獲取值。

 
 
 
 
  1. Lazy lazy = Lazy.of(Math::random); 
  2. lazy.isEvaluated(); // = false 
  3. lazy.get();         // = 0.123 (random generated) 
  4. lazy.isEvaluated(); // = true 
  5. lazy.get();         // = 0.123 (memoized) 

這樣的擴展方法有很多。但我最常用的,還是Try和元組。它讓代碼變的更加優(yōu)雅,表達意圖也更加清晰。

哦對了。resilience4j就重度使用了vavr,就是那個Hystrix不再更新之后,官方推薦的那個熔斷組件。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。


分享文章:用過Optional;那用過Try么?
URL網(wǎng)址:http://www.5511xx.com/article/dhgcpjj.html