Java 流异常处理。更清晰代码的最佳方式
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 和 return 一个带有 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 并将附加参数传递给该方法,即您要为其处理异常的异常 class。
处理方法看起来像
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 就不会看起来很乱,你可以在调用时决定要处理哪个异常。
我有以下代码
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 和 return 一个带有 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 并将附加参数传递给该方法,即您要为其处理异常的异常 class。
处理方法看起来像
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 就不会看起来很乱,你可以在调用时决定要处理哪个异常。