'isPresent ()'확인없이 'Optional.get ()'


88

Java에 다음 검색 코드가 있습니다.

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

이름으로 열을 찾고 찾은 첫 번째 열을 반환하고 싶었습니다.

아무것도 발견되지 않고 처리해야하는 경우가 있다는 것을 알고 있지만 어떻게해야합니까?

이 욕설이 원하는 것입니까?

'Optional.get()' without 'isPresent()' check

?

어떻게 고치는 지? null아무것도 발견되지 않으면 반환 하고 싶습니다 .

최신 정보

좋아, 좋아, 난 그냥 실현이되지 않았다 findFirst()돌아갑니다 Optional.


2
$Java에서 식별자로 사용해서는 안됩니다 . JLS Sec 3.8 : "$ 기호는 기계적으로 생성 된 소스 코드에서만 사용해야하며 드물게 레거시 시스템의 기존 이름에 액세스하는 데 사용해야합니다."
Andy Turner

답변:


179

교체 get()와 함께 orElse(null).


1
왜? :) 왜 orElse"or"로 시작합니까?
Dims

15
그것이 메소드 이름이기 때문입니다. 그리고 else키워드입니다.
Andy Turner

8
@Dims는 getOrElse의 짧은 형태로 get을 생략합니다. 선택 사항을 사용 하면 값이 null이면 예외가 발생 하기 때문에 일반적으로 orElse대신 사용해야합니다 . getget
puhlen 2016-08-02

4
@puhlen는 orElseGet()걸리는 Supplier<T>반면 orElse()걸립니다 T. 이들은 동등하지 않습니다.
bcsb1001

1
@ bcsb1001은 그가 말하려고 한 것이 아닙니다. "getOrElse"는 목적을 설명하기 위해 발명 한 이름입니다 orElse. orElseGet그의 의견에 대한 언급 이 없습니다 ;)
Rorrim

22
...findFirst().orElse(null);

값이 있으면 반환하고, 그렇지 않으면를 반환합니다 null. 문서는 말한다 전달 된 매개 변수가 될 수 있음 null(대한 금지 무엇을 orElseGet하고 orElseThrow).


1
그것은 부분적으로 사실입니다. findFirst ()에는 다음 규칙이 있습니다. "만남 순서가 없으면 스트림에서 요소를 리턴합니다." -> 필터가 일치하는 요소를 반환하지 않으면 findFirst ()는 첫 번째 요소를 반환합니다 (스트림이 미리 비어 있다는 점을 제외하고)
Fl0R1D3R

1

내 해결책은 이렇게 확인하는 것이 었습니다.

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

선택 사항이 생성되어 코드가 수십 년 후에 마침내 null을 피할 수 있습니다.

.get ()을 제거하고 Optional 자체를 반환하고 호출 코드가 적절하게 처리하도록합니다 (null을 반환하는 경우와 마찬가지로).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.