Java | Spring
[Java][Java 8] Optional 활용하기, orElseGet
binaryJournalist
2020. 11. 26. 14:44
반응형
Java로 백엔드를 개발하는 중에 Optional을 쓴다면 아래와 같이 많이들 썼을 것이다.
// ServiceImpl
@Override
public Entity findOneEntity(Long entityId) {
Optional<Entity> optEntity = entityRepository.findById(entityId);
Entity entity = new Entity();
if(optEntity.isPresent()) {
entity = optEntity.get();
}
return entity;
}
오늘 이걸 두 문장으로 끝내버리는 Optional 함수 orElseGet 을 알아냈다.
orElseGet은 찾아온 값이 null 이 아닐 경우에만 값을 get 해준다.
위와 아래 코드에서 의도된 return 값은 같다.
// ServiceImpl
@Override
public Entity findOneEntity(Long entityId) {
Optional<Entity> optEntity = entityRepository.findById(entityId);
return optEntity.orElseGet(Entity::new);
}
위 식은 optEntity에 값이 없을(null) 경우
Entity entity = new Entity();
값이 있을 경우(not null)
Entity entity = optEntity.get();
이렇게 된다.
만약 orElseGet 대신 orElse 를 쓰게 된다면
// ServiceImpl
@Override
public Entity findOneEntity(Long entityId) {
Optional<Entity> optEntity = entityRepository.findById(entityId);
return optEntity.orElse(new Entity());
}
값이 있든 없든
Entity entity = new Entity();
이 값만 return 해 준다.
orElseGet 안에 null을 넣는 것도 가능하다. -> 2/18 오류발생으로 수정한다.
코드 상으로는 null을 넣는 것은 가능하지만 이럴 경우 NullPointerExceiption이 발생한다.
return optEntity.orElseGet(null);
애초에 NullPointerExceiption 방지하려 쓴 orElseGet 인데 위의 경우는 무용지물이므로
return optEntity.orElse(new Entity());
return optEntity.orElse(Entity::new);
위처럼 쓰는 것을 권장한다.
나의 경우
Entity entity = entityRepository.findById(entityDto.getEntityId()).orElseGet(Entity::new);
if (entity.getEntityId() == null {
throw SomeException;
}
이런 방식으로 사용하였다.
참고 사이트: homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/
반응형