日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

流操作中的noException

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 流操作中的noException 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文介紹了一些簡單的編碼實踐。 沒什么好看的。 在StackOverflow上也進行了討論。

您只是將一個龐大而復雜的循環重構為一個更具可讀性的流表達式,而忘記了某些方法調用引發了異常。 包含此代碼的方法將引發此異常,該異常在方法頭中聲明。 您不想在此級別上處理此異常。 它在更高級別的調用堆棧上受到關注。 而且您會在代碼中遇到令人討厭的錯誤,就像釘子下的碎片一樣。

假設您要將字符串轉換為IP地址。

private static final String[] allowed = {"127.0.0.1", "::1"};...Arrays.stream(allowed).map(InetAddress::getByName).collect(Collectors.toSet());

問題是getByName(String host)拋出UnknownHostException 。 這不是RuntimeException因此必須對其進行檢查,但是map()方法需要一個Function作為參數,而Function不會引發任何異常。 我們需要一個不會拋出異常的getByName版本(或者我們需要使用一種對異常更me腳的語言)。

Arrays.stream(allowed).map(s -> {try {return InetAddress.getByName(s);} catch (UnknownHostException e) {throw new RuntimeException(e);}}).collect(Collectors.toSet());

這比原始循環更丑陋和混亂。 是否可以嘗試/捕獲放入實用程序類中的所有內容,并調用一些包裝實際調用的la腳靜態方法? 是的。 靜態導入以下方法:

public interface ExceptionalSupplier<T> {T apply() throws Exception;} ...public static <T> T lame(ExceptionalSupplier<T> z) {try {return z.apply();} catch (Exception e) {throw new RuntimeException(e);}}

導入后可以寫

Arrays.stream(allowed).map(s -> lame(() -> InetAddress.getByName(s))).collect(Collectors.toSet());

要注意的是,您不能只lame( ... )通話。 您必須將其轉換為出色的供應商。 具有與Supplier相同的功能接口,但允許例外。

還是不理想。 (嗯,它是Java,所以您期望什么?)好的。 它是Java,但仍然可以做得更好。 如果不是通過供應商將表達式轉換為不引發異常的表達式,我們可以將引發異常的“函數”轉換為不引發異常的表達式。 我們需要一個接受異常函數并返回正常函數的方法。 這樣,我們可以在代碼中保存() ->噪聲。 可讀性規則。

public interface ExceptionalFunction<T, R> {R apply(T r) throws Exception;} ...public static <T, R> Function<T, R> lame(ExceptionalFunction<T, R> f) {return (T r) -> {try {return f.apply(r);} catch (Exception e) {throw new RuntimeException(e);}};}

使用該實用程序,“最終”表達式將是

Collection<InetAddress> allowedAddresses =Arrays.stream(allowed).map(lame(InetAddress::getByName)).collect(Collectors.toSet());

GIST中的實際實用程序類定義了一個WrapperException擴展了RuntimeException以便您可以在方法中的某個地方捕獲異常,例如

public myMethod() throws IOException { try{... do whatever here we do ...} catch (RuntTimeExceptionWrapper.WrapperException we) {throw (IOException) we.getCause();}

這樣,該方法將引發異常,但是如果任何地方還有另一個RuntimeException將引發未捕獲。

這只是一個簡單,不錯的小技巧,可以幫助您跟上Java,它向后兼容,而不是使用現代,簡潔的其他語言開始開發,而讓您將更多精力放在需要編碼的功能上編碼技術。

翻譯自: https://www.javacodegeeks.com/2017/09/noexception-stream-operation.html

總結

以上是生活随笔為你收集整理的流操作中的noException的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。