[Java] Lambda - Exception Handling
- Java
- 2020. 8. 16.
이번 글에서는 lambda의 exception handling 방법에 대해 알아보도록 하겠습니다.
1. Exception Handling
lambda에서 exception handling을 구현 하기위해선 어떻게 해야할까요? 😅
예를 들어 입력받은 배열의 elements를 key로 나눈 값을 출력하는 예제가 있다고 가정해보겠습니다.
public class ExceptionHandling {
public static void main(String[] args) {
int[] someNumbers = {1, 2, 3, 4};
int key = 2;
// print
process(someNumbers, key, (k, v) -> System.out.println(k / v));
}
private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer) {
for (int i : someNumbers) {
consumer.accept(i, key);
}
}
}
위의 경우, 만약 key가 0이라면 어떻게 될까요..?
당연히 위와 같이 Exception이 발생하게 됩니다.
1-1) inline try catch
그렇다면 예외 처리를 위해 다음과 같이 lambda 식을 변경해보겠습니다.
process(someNumbers, key, (k, v) -> {
try{
System.out.println(k / v);
}catch (ArithmeticException e){
System.out.println("Exception Handling..");
}
});
음.. 😂 뭔가 찝찝하네요..
우리는 이전 글에서 lambda 식을 사용하는 이유 중 하나로, 짧고 간결한 코드를 예로 들었습니다. 하지만, 위의 경우는 전혀 코드가 간결하지 않습니다..
이를 해결할 방법은 'wrapper lambda' 메서드를 사용하는 것 입니다.
1-2) wrapper lambda
wrapper lambda 함수를 사용하면 기존의 짧고 간결한 lambda 식을 유지하며 exception handling을 처리할 수 있습니다. 😎
wrapper lambda 함수란, 전달받은 lambda 식을 trigger하는 기능만 수행하는 method라고 해석 할 수 있습니다.
public class ExceptionHandling {
public static void main(String[] args) {
int[] someNumbers = {1, 2, 3, 4};
int key = 0;
process(someNumbers, key, wrapperLambda((v, k) -> System.out.println(v / k)));
}
private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer) {
for (int i : someNumbers) {
consumer.accept(i, key);
}
}
private static BiConsumer<Integer, Integer> wrapperLambda(BiConsumer<Integer, Integer> consumer) {
return (v, k) -> {
try {
consumer.accept(v, k);
} catch (ArithmeticException e) {
System.out.println("Exception Handling..");
}
};
}
}
wrapperLambda 함수의 역할은 다음과 같습니다.
• 전달받은 lambda 식을 try catch 문으로 감싸 exception handling을 처리합니다.
• 전달받은 lambda 의 accept 메서드를 trigger 합니다.
• 전달받은 input lambda와 동일한 type을 return 합니다.
기존의 lambda를 try catch 포장지로 감싸서 method에 전달하는 역할을 수행한다고 이해하면 될 것 같습니다.
실행해보면 위와 같이 정상적으로 Exception Handling이 동작하는 것을 확인할 수 있습니다. 👏👏👏
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Java' 카테고리의 다른 글
[Java] Lambda - This Reference (0) | 2020.08.16 |
---|---|
[Java] Lambda - Closure (0) | 2020.08.16 |
[Java] Lambda - Functional Interface (0) | 2020.08.16 |
[Java] Lambda - Using Lambda (0) | 2020.08.16 |
[Java] Lambda - Understanding Lambda (0) | 2020.08.16 |