[java] 스트림 API의 에러 처리 방법

자바 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