람다 및 기본 메소드 인터페이스에 대한 새로운 Java 8 기능이 많이 있습니다. 그러나 여전히 확인 된 예외로 지루합니다. 예를 들어 객체의 보이는 필드를 모두 나열하려면 간단히 다음과 같이 작성하고 싶습니다.
Arrays.asList(p.getClass().getFields()).forEach(
f -> System.out.println(f.get(p))
);
그러나 get
메소드가 Consumer
인터페이스 계약에 동의하지 않는 확인 된 예외를 throw 할 수 있으므로 해당 예외를 포착하고 다음 코드를 작성해야합니다.
Arrays.asList(p.getClass().getFields()).forEach(
f -> {
try {
System.out.println(f.get(p));
} catch (IllegalArgumentException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
);
그러나 대부분의 경우 예외를 a로 throw RuntimeException
하고 프로그램에서 컴파일 오류가없는 예외를 처리하도록합니다.
따라서 확인 된 예외 성가심에 대한 논쟁의 여지가있는 해결 방법에 대한 귀하의 의견을 듣고 싶습니다. 이를 위해 다음과 같이 보조 인터페이스 ConsumerCheckException<T>
와 유틸리티 기능을 만들었습니다 rethrow
( Doval의 의견 에 따라 업데이트 됨 ).
@FunctionalInterface
public interface ConsumerCheckException<T>{
void accept(T elem) throws Exception;
}
public class Wrappers {
public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) {
return elem -> {
try {
c.accept(elem);
} catch (Exception ex) {
/**
* within sneakyThrow() we cast to the parameterized type T.
* In this case that type is RuntimeException.
* At runtime, however, the generic types have been erased, so
* that there is no T type anymore to cast to, so the cast
* disappears.
*/
Wrappers.<RuntimeException>sneakyThrow(ex);
}
};
}
/**
* Reinier Zwitserloot who, as far as I know, had the first mention of this
* technique in 2009 on the java posse mailing list.
* http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html
*/
public static <T extends Throwable> T sneakyThrow(Throwable t) {
throw (T) t;
}
}
그리고 지금은 쓸 수 있습니다 :
Arrays.asList(p.getClass().getFields()).forEach(
rethrow(f -> System.out.println(f.get(p)))
);
이것이 체크 된 예외를 돌릴 수있는 가장 좋은 관용구인지 확실하지 않지만 설명 한 것처럼 체크 된 예외를 처리하지 않고 첫 번째 예를 얻는 더 편리한 방법을 원합니다. 이것은 내가 찾은 가장 간단한 방법입니다 그것을하기 위해.
sneakyThrow
내부를 사용 rethrow
하여 원래의 확인 된 예외를로 감싸는 대신 던질 수 있습니다 RuntimeException
. 또는 동일한 작업을 수행하는 Project Lombok 의 @SneakyThrows
주석을 사용할 수 있습니다 .
Consumer
s in forEach
은 parallel Stream
s를 사용할 때 병렬 방식으로 실행될 수 있습니다 . 소비자와의 관계에서 제기 된 던지기는 호출 스레드로 전파되어 1) 적절하지 않을 수도있는 동시에 실행중인 다른 소비자를 중단시키지 않으며 2 명 이상의 소비자가 무언가를 던질 경우에만 던지는 것들 중 하나는 호출 스레드에 의해 볼 수 있습니다.