[英]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.