>  기사  >  Java  >  Java 8 Lambda 스트림에서 확인된 예외를 처리하는 방법은 무엇입니까?

Java 8 Lambda 스트림에서 확인된 예외를 처리하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-27 04:04:03509검색

How to Handle Checked Exceptions in Java 8 Lambda Streams?

Java 8: Lambda 스트림 및 예외 처리

Java 8에서 람다 표현식은 스트림 처리에 많은 이점을 제공합니다. 그러나 IOException과 같이 확인된 예외를 발생시키는 메서드를 처리할 때 개발자는 컴파일 오류에 직면할 수 있습니다.

다음 코드를 고려하세요.

<code class="java">class Bank {
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s = accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
}</code>

코드는 활성화된 예외 집합을 검색하는 것을 목표로 합니다. 계좌 번호. 그러나 isActive 및 getNumber 메소드가 서명에서 포착하거나 선언해야 하는 IOException을 발생시키기 때문에 컴파일에 실패합니다.

람다 표현식에서 확인된 예외 포착

To 이 문제를 해결하려면 확인된 예외를 람다 식 자체 내에서 처리해야 합니다. 그러나 단순히 람다 내에 try-catch 블록을 배치하는 것만으로는 충분하지 않습니다. 예외는 람다의 범위를 벗어나기 전에 포착되어야 합니다.

UncheckedIOException 래퍼 사용

한 가지 접근 방식은 확인된 예외를 변환하는 사용자 지정 래퍼 클래스인 UncheckedIOException을 사용하는 것입니다. 선택되지 않은 것들에게. 이를 통해 람다가 확인되지 않은 예외를 발생시키고 스트림의 후속 작업에서 처리할 수 있습니다.

<code class="java">s = s.filter(a -> {
    try {
        return a.isActive();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});</code>

일반 예외 래퍼 사용

또 다른 옵션은 모든 유형의 예외를 포착하고 이를 확인되지 않은 예외로 다시 발생시키는 일반 래퍼 메소드인 uncheckCall.

<code class="java">return s.filter(a -> uncheckCall(a::isActive))
        .map(Account::getNumber)
        .collect(toSet());</code>

이 경우 스트림의 후속 작업은 확인되지 않은 예외를 수신하고 이에 따라 처리될 수 있습니다.

컴파일러의 예외 검사 해제

더 발전된 접근 방식은 컴파일러의 예외 검사를 효과적으로 비활성화하는 방법을 사용하는 것입니다. 그러나 이를 위해서는 잠재적인 위험에 대한 주의와 명확한 이해가 필요합니다. 이 접근 방식에서는 다음 코드가 사용됩니다.

<code class="java">public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (Exception e) {
        sneakyThrow(e);
        return null; // Unreachable but needed to satisfy compiler
    }
}</code>

이 방법을 사용하면 확인된 예외가 포착되어 런타임 예외로 다시 발생됩니다. 그러나 람다 실행 사이트에서 예외를 처리해야 하는 경우 이 접근 방식으로 인해 예기치 않은 동작이 발생할 수 있다는 점에 유의하는 것이 중요합니다.

위 내용은 Java 8 Lambda 스트림에서 확인된 예외를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.