Binary Journey

[Java][Java 8] Optional 활용하기, orElseGet 본문

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/

반응형