자바 8부터 도입된 스트림(Stream) API는 데이터 처리를 위한 강력한 도구로서 많은 개발자들에게 사용되고 있습니다. 하지만 스트림 API를 사용할 때 에러 처리에 대한 고려가 필요합니다. 이번 포스트에서는 스트림 API에서 어떻게 에러를 처리할 수 있는지 살펴보겠습니다.
1. 예외 전파하기
스트림에서 예외가 발생하면 해당 예외를 그대로 전파하는 방법입니다. 이 방법을 사용하면 예외가 발생한 시점에서 스트림이 종료되고 예외가 호출자로 전달됩니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
try {
numbers.stream()
.map(n -> divideByZero(n)) // divideByZero 메서드에서 ArithmeticException이 발생할 수 있음
.collect(Collectors.toList());
} catch (ArithmeticException e) {
// 예외 처리
}
위의 예제에서 divideByZero()
메서드에서 0으로 나누려고 하면 ArithmeticException
이 발생할 수 있습니다. 이 예외를 전파하여 호출자에서 처리할 수 있습니다.
2. 예외를 다른 값으로 대체하기
스트림에서 예외가 발생하면 해당 스트림의 요소를 다른 값으로 대체할 수 있습니다. 이 방법을 사용하면 예외가 발생해도 스트림의 처리가 멈추지 않고 계속 진행됩니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.map(n -> {
try {
return divideByZero(n); // divideByZero 메서드에서 ArithmeticException이 발생할 수 있음
} catch (ArithmeticException e) {
return 0; // 예외가 발생하면 0으로 대체
}
})
.collect(Collectors.toList());
위의 예제에서 divideByZero()
메서드에서 0으로 나누려고 하면 ArithmeticException
이 발생할 수 있습니다. 하지만 try-catch
블록을 사용하여 예외를 처리하고, 대신 0을 반환하여 스트림의 처리가 계속될 수 있도록 할 수 있습니다.
3. Optional로 감싸기
스트림에서 예외가 발생할 수 있는 코드를 Optional
로 감싸는 방법도 있습니다. 이 방법을 사용하면 예외가 발생하더라도 Optional
객체를 반환하므로 스트림의 처리가 계속될 수 있습니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Optional<Integer>> result = numbers.stream()
.map(n -> Optional.ofNullable(divideByZero(n))) // divideByZero 메서드에서 ArithmeticException이 발생할 수 있음
.collect(Collectors.toList());
위의 예제에서 divideByZero()
메서드에서 0으로 나누려고 하면 ArithmeticException
이 발생할 수 있습니다. 하지만 Optional.ofNullable()
메서드로 감싸므로 예외가 발생해도 Optional
객체를 반환합니다.
결론
스트림 API를 사용할 때 예외 처리에 대한 적절한 처리 방법을 선택하는 것은 중요합니다. 예외 전파하기, 예외를 다른 값으로 대체하기, Optional로 감싸기 등 다양한 방법을 사용할 수 있으며, 상황에 맞게 적절한 방법을 선택하여 개발해야 합니다.
참고: https://www.baeldung.com/java-8-streams