繁体   English   中英

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

[英]Java Streams Exception handling. Best way for cleaner code

我有以下代码

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看起来有点凌乱。

我也可以在process方法中处理该异常,但它是通用的,我们不知道我们要处理的异常。

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

经过一些好心人的建议,我有了一个答案。 希望这对某人有帮助。

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");
            }

        };
}

在您的处理方法中应用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不会显得凌乱,您可以在调用时决定要处理的异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM