<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ## 簡介 * `Lambda`表達式利用函數式編程提供精簡的方式表達行為。 * 然而,JDK函數式接口沒有很好地處理異常,使得處理異常代碼非常臃腫和麻煩。 * 下面我們來探討下 `Lambda`表達式中處理異常的解決方案 ## 代碼示例 首先我們看一段簡單的代碼,將50與List中每個元素相除并打印出結果 ``` List integers = Arrays.asList(1, 2, 3, 4, 5, 6); integers.forEach(i -> System.out.println(50 / i)); ``` 這樣看是不會有問題的,代碼簡潔。 但是如果List中包含元素`0`,那么就會拋出異常:`ArithmeticException: / by zero` 有經驗的小伙伴可能會立馬給出解決方案,使用傳統的try-catch來處理異常,代碼如下: ``` List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 0); integers.forEach(i -> { try { System.out.println(50 / i); } catch (ArithmeticException e) { System.err.println( "Arithmetic Exception occured : " + e.getMessage()); } }); ``` 使用try-catch解決了問題,但是失去了lambda表達式的精簡,代碼變得臃腫,想必并不是完美的解決方案。 對于一些強迫癥老哥來說,這種代碼是絕對不能存活的,所以我們需要如下的解決方案。 ## 解決方案 我們將會對拋出異常的函數進行包裝,使其不拋出受檢異常 如果一個`FunctionInterface`的方法會拋出受檢異常(比如`Exception`),那么該`FunctionInterface`便可以作為會拋出受檢異常的 Lambda 的目標類型。 我們定義如下一個`FunctionInterface`: ``` @FunctionalInterface interface UncheckedFunction<T, R> { R apply(T t) throws Exception; } ``` 那么該`FunctionInterface`便可以作為拋出受檢異常的 Lambda 的目標類型,此時 Lambda 中并不需要捕獲異常,因為目標類型的`apply`方法已經將異常拋出了。 我們如何使用`UncheckedFunction`到流式操作的 Lambda 中呢? 首先我們定義一個`Try`類,它的`of`方法提供將`UncheckedFunction`包裝為`Function`的功能: ``` public class Try { public static <T, R> Function<T, R> of(UncheckedFunction<T, R> mapper) { Objects.requireNonNull(mapper); return t -> { try { return mapper.apply(t); } catch (Exception e) { throw Exceptions.unchecked(e); } }; } @FunctionalInterface public interface UncheckedFunction<T, R> { R apply(T t) throws Exception; } } ``` 然后在原先的代碼中,我們使用`Try.of`方法來對會拋出受檢異常的 Lambda 進行包裝: ``` List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 0); integers.forEach(Try.of(i -> System.out.println(50 / i))); ``` 此時,我們便可以選擇是否去捕獲異常(`RuntimeException`)。這種解決方法下,我們一般不關心拋出異常的情況 。 比如自己寫的小例子,拋出了異常程序就該終止;或者你知道這個 Lambda 確實 100% 不會拋出異常。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看