본문 바로가기
카테고리 없음

orElseGet()과 orElse()의 차이

by N.Damgom 2021. 3. 27.

cfdf.tistory.com/34

 

java, optional의 orElse와 orElseGet의 차이

java8의 optional api 많이들 사용하실텐데요. 어찌보면 당연하지만 햇갈리는 내용에 대해 다뤄보겠습니다. 마무리 연산인 orElse와 orElseGet의 차이입니다. 귀찮으신분들을 위해 요약을 먼저 하자면 orE

cfdf.tistory.com

orElse와 orElseGet에 대해 흥미로운 글을 봤다. 무심코 넘겼던 부분인데 둘은 꽤 중요한 차이가 있다.

 

orElse(Value)는 Value가 메모리 상에 존재한다고 가정하므로, Value가 함수의 리턴값이라면 Optional 내부 값이 null이건 말건 함수를 실행시켜 Value을 가져온다.

 

다음의 예제를 보자.

 

 

orElse문 안의 Value는 메모리상에 존재한다고 가정하기 때문에 name.orElse(createDefaultName())에서 name이 null이 아님에도 orElse문 안의 createDefaultName() 함수가 호출된다.

 

 

실행 결과 myName에 Value를 쓰지 않았는데도 createDefaultName() 메서드가 호출되어 10초의 시간이 걸렸다.

 

 

두번째로는 orElseGet(Supplier)인 경우다. orElseGet은 null일 경우 supplier를 호출하는 것이므로 null이 아니면 Supplier를 호출하지 않는다.

 

 

결과는 다음과 같다.

 

 

 

 

결론은 orElse(Value)를 쓴다면 의도치 않은 함수 호출을 주의해야 한다.