새로운 Java8 스트림 API를 사용하여 컬렉션에서 하나의 특정 요소를 찾을 때 다음과 같은 코드를 작성합니다.
String theFirstString = myCollection.stream()
.findFirst()
.get();
여기서 IntelliJ는 isPresent ()를 먼저 확인하지 않고 get ()을 호출한다고 경고합니다.
그러나이 코드는 다음과 같습니다.
String theFirstString = myCollection.iterator().next();
... 경고가 없습니다.
두 가지 기술 사이에 어떤 방식으로 스트리밍 접근 방식을 "위험한"것으로 만드는 중대한 차이점이 있습니까? isPresent ()를 먼저 호출하지 않고 get ()을 호출하지 않는 것이 중요합니까? 인터넷 검색, Optional <>을 사용하여 프로그래머가 부주의하게 다루는 방법에 대한 기사를 발견하고 언제든지 get ()을 호출 할 수 있다고 가정합니다.
내 코드가 버그가있는 곳에 가능한 한 가깝게 예외가 발생하는 것을 좋아합니다.이 경우 발견 할 요소가 없을 때 get ()을 호출하는 곳입니다. 쓸모없는 에세이를 작성하고 싶지 않습니다 :
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... 알지 못하는 get () 예외를 유발할 위험이 없다면?
Karl Bielefeldt의 답변과 Hulk의 의견을 읽은 후 위의 예외 코드가 약간 어색하다는 것을 깨달았습니다.
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
이것은 더 유용 해 보이며 아마도 많은 곳에서 자연스러워 질 것입니다. 나는이 모든 것을 처리하지 않고도 목록에서 하나의 요소를 선택할 수 있기를 원한다고 생각하지만, 이러한 종류의 구조에 익숙해 져야 할 수도 있습니다.