Java 8 메소드 참조 : 매개 변수화 된 결과를 제공 할 수있는 공급 업체 제공


259

사용하고 싶습니다

java.util.Optional.orElseThrow()

생성자 매개 변수를 요청하는 예외 유형이 있습니다. 이 같은:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

인수 가치를 전달하는 공급 업체를 만드는 방법이 있습니까?


43
왜 안돼 orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

6
많은 스트림 및 선택적 경험을 갖춘 전문 Java 프로그래머 ... 여전히 여기에 있습니다. 그리고 이것이 제가 Kotlin을 선호하는 이유입니다.
Drew Stephens

답변:



22

메소드에서 RuntimeException 만 던질 수있는 것으로 보입니다 orElseThrow. 그렇지 않으면 다음과 같은 오류 메시지가 나타납니다. MyException cannot be converted to java.lang.RuntimeException

업데이트 :-이전 버전의 JDK에서 문제였습니다. 최신 버전에서는이 문제가 표시되지 않습니다.


1
고마워, Optional그루비에서 사용할 때 나를 버리고있었습니다 . throw Exception그루비 클로저에서 시도 했지만로 실패 java.lang.reflect.UndeclaredThrowableException하여 RuntimeException고정으로 변경되었습니다 .
Ted Naleid

그것에 대해 알아서 반갑습니다. 다행히도 내 경우에는 RuntimeExceptions를 사용하고 있지만 항상 그런 것은 아닙니다.
hbobenicio

잘못 의 클래스 설명서에 따라 Optional.orElseThrow당신이 던질 수 있다고하는 Throwable의미 Error또는를 Exception.
Basil Bourque

JDK 8의 구 버전에서는 이것이 문제라고 생각합니다.
Manu

@Manu이 아마도 당신이 언급하는 JDK-8047338 이 질문에 대해 논의 Optional.orElseThrow와 스트림 내에서의 RuntimeException을 던져 . 그렇다면 답변에 포함하십시오. 나는 이것이 자리에 있는지 여부를 식별하기에 충분한 커피를 얻지 못했기 때문에 귀하의 답변을 직접 편집하지 마십시오.
Basil Bourque 17 년

10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

오류 ""Optional <QueryEntities> 유형의 orElseThrow (Supplier <? extends X>) 메소드를 인수 (()-> {})에 적용 할 수 없습니다. "
BdEngineer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.