우선 두 방법의 선언을 확인하십시오.
1) OrElse : 논리를 실행하고 결과를 인수로 전달합니다.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet : 옵션 내부의 값이 null 인 경우 논리 실행
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
위 선언에 대한 설명 :
“Optional.orElse”의 인수는 선택적 (null, empty 또는 value)의 개체 값에 관계없이 항상 실행됩니다. “Optional.orElse”를 사용하는 동안 위에서 언급 한 사항을 항상 고려하십시오. 그렇지 않으면 다음 상황에서“Optional.orElse”를 사용하는 것이 매우 위험 할 수 있습니다.
위험 -1) 로깅 문제 : orElse 내부의 내용에 로그 문이 포함 된 경우 :이 경우 매번 로깅이 끝납니다.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
위험 -2) 성능 문제 : orelse 내부의 컨텐츠가 시간 집약적 인 경우 : 시간 집약적 인 컨텐츠는 모든 i / o 조작 DB 호출, API 호출, 파일 읽기가 될 수 있습니다. 이러한 내용을 orElse ()에 넣으면 시스템은 사용하지 않는 코드를 실행하게됩니다.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
위험 -3) 불법 상태 또는 버그 문제 : orElse 내부의 콘텐츠가 일부 객체 상태를 변경하는 경우 : Optional.map 함수 내에서 같은 장소에 다른 객체를 사용하고있을 수 있으며 이는 치명적인 버그가 될 수 있습니다.
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
그러면 orElse ()로 언제 갈 수 있습니까?
기본값이 상수 객체 enum 인 경우 orElse를 사용하는 것이 좋습니다. 위의 모든 경우 Optional.orElse () 대신 Optional.orElseGet () (선택 사항에 비어 있지 않은 값이 포함 된 경우에만 실행)을 사용할 수 있습니다. 왜?? orElse에서는 기본 결과 값을 전달하지만 orElseGet에서는 Supplier를 전달하고 Supplier의 메소드는 Optional의 값이 null 인 경우에만 실행합니다.
주요 내용은 다음과 같습니다.
- “Optional.orElse”에 로그 문이 포함되어 있으면 사용하지 마십시오.
- 시간이 많이 걸리는 논리가 포함 된 "Optional.orElse"를 사용하지 마십시오.
- “Optional.orElse”가 일부 객체 상태를 변경하는 경우 사용하지 마십시오.
- 상수 enum을 반환해야하는 경우“Optional.orElse”를 사용하십시오.
- 1, 2 및 3 포인트에서 언급 된 상황에서“Optional.orElseGet”을 선호하십시오.
나는 나의 중간 블로그 에서 point-2 ( “Optional.map/Optional.orElse”! =“if / else” ) 에서 이것을 설명했다 . 코더가 아닌 프로그래머로 Java8 사용
orElseGet
가치가없는 경우에만 공급자에게 전화를 걸기 때문입니다 .