我有以下代码
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以获得更清晰的代码吗?任何建议将不胜感激。
答案 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看起来不会很乱,你可以决定在调用时要处理哪个异常。