中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Try

發布時間:2021-10-21 10:26:38 來源:億速云 閱讀:254 作者:iii 欄目:編程語言

這篇文章主要介紹“怎么使用Try”,在日常操作中,相信很多人在怎么使用Try問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Try”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

比如我們在平常的編碼中,經常遇到對輸入參數的非空判斷。

public void getXXX(Map<String, String> params) {     Map<String, String> map = params;     if (map == params) {         map = new HashMap<>();     } }

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

public void getXXX(Map<String, String> params) {     Map<String, String> map = Optional.ofNullable(params).orElse(new HashMap<>()); }

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

1. 復雜例子

看一個比較復雜的例子。

假如我們需要的數據層次比較深。

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

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

public void getCityCode(Customer customer) {     String cityCode = "000";     if (customer != null) {         Address address = customer.getAddress();         if (null != address) {             City city = address.getCity();             if (city != null) {                 String code = city.getCityCode();                 if (null != code && code.length() >= 3) {                     cityCode = code.substring(0, 3);                 }             }         }     }     System.out.println(cityCode); }

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

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

代碼是不是顏值很高?

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

2. Optional的隱秘內容

其實,早在Java8發布之前(2014),guava就有了類似的工具,但由于當時并沒有lambda語法,所以只能做些簡單的應用。

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

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

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

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

但我還是喜歡用。誰讓國內大多數都是cruder呢?

3. Try為何物?

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

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

它的maven坐標是:

<dependency>     <groupId>io.vavr</groupId>     <artifactId>vavr</artifactId>     <version>0.10.3</version> </dependency>

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

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

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

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

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

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

怎么使用Try

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

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

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

4. vavr的更多操作

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

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

public String vavrMatch(String input) {     return Match(input).of(             Case($("a"), "a1"),             Case($("b"), "b2"),             Case($("c"), "c3"),             Case($(), "unknown")     ); }

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

使用Vavr的Function,最多支持22個參數!

怎么使用Try

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

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

// (Java, 8) Tuple2<String, Integer> java8 = Tuple.of("Java", 8);   // "Java" String s = java8._1;   // 8 Integer i = java8._2;

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

怎么使用Try

另外,還有lazy等小工具。比如延遲獲取值。

Lazy<Double> lazy = Lazy.of(Math::random); lazy.isEvaluated(); // = false lazy.get();         // = 0.123 (random generated) lazy.isEvaluated(); // = true lazy.get();         // = 0.123 (memoized)

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

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

到此,關于“怎么使用Try”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大姚县| 怀宁县| 子洲县| 青神县| 精河县| 海淀区| 英超| 浦县| 吉林市| 水富县| 临漳县| 祁连县| 泉州市| 兴义市| 财经| 东阿县| 江口县| 林西县| 城口县| 探索| 临洮县| 新乐市| 家居| 肥乡县| 时尚| 新河县| 安多县| 沐川县| 益阳市| 江永县| 托克托县| 高清| 红原县| 上饶县| 股票| 龙门县| 桑植县| 辉南县| 永靖县| 涟源市| 蓝田县|