Java Streams异常处理。清洁代码的最佳方式

时间:2018-02-14 21:05:05

标签: java lambda exception-handling java-stream

我有以下代码

import java.util.function.BiConsumer;

public class ExceptionHandlingLambda {

    public static void main(String[] args) {
        int [] someNumbers = { 1, 2, 3, 4 };
        int key = 2;

        process(someNumbers, key, (v,k) -> {
            try{
                System.out.println(v/k);
            }
            catch(ArithmeticException e){
                //handle exception
            }
        });

    }

    private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer) {
        for (int i : someNumbers) { 
          //can put a try catch here but this is generic and we don't know what exception we are catching.          
            consumer.accept(i, key);
        }

    }
}

我正在尝试在lambda中处理一些异常。从上面我已经在lambda中处理了一个异常。 我认为这让我的lambda看起来有些混乱。

我也可以在进程方法中处理异常,但它是通用的,我们不知道我们正在处理什么异常。

还有其他更好的方法来处理lambda以获得更清晰的代码吗?任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

在一些善良的心灵提出建议后,我得到了答案。希望这有助于某人。

process(someNumbers, key, wrapperLambda((v, k) -> System.out.println(v / k))); 

//with method reference 
process(someNumbers, key, ExceptionHandlingLambda::wrapperLambda);

lambda的包装函数,它接受一个lambda并使用try catch返回一个lambda,使其更加清晰。

private static BiConsumer<Integer, Integer> wrapperLambda(BiConsumer<Integer, Integer> consumer) {
        //creating a new lambda and return.
        // return (v,k) -> System.out.println(v+k); this would replace the lambda with addition lambda (v+k)

        return (v, k) ->  {
            try {
                consumer.accept(v, k); //execute whatever is passed in. 
            }
            catch (ArithmeticException e) {
                System.out.println("Exception caught in wrapper lambda");
            }

        };
}

答案 1 :(得分:-1)

在您的process方法中应用try catch并将另一个参数传递给该方法,即您要为其处理异常的异常类。

流程方法看起来像

private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer, Class<E> clazz) {
    for (int i : someNumbers) { 
       try{
        consumer.accept(i, key);
     } catch(Exception ex) {
         try {
            E exCast = clazz.cast(ex);
            System.err.println(
              "Exception occured : " + exCast.getMessage());
        } catch (ClassCastException ccEx) {
            throw ex;
        }
      }
    }

}

这样你的lambda看起来不会很乱,你可以决定在调用时要处理哪个异常。