流操作中的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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: camel.js_Camel 2.11
- 下一篇: Errai框架简介