단일 Entity를 반환할 때 Optional<>
을 사용하는 것은 해당 Entity가 존재하지 않을 수 있는 상황을 고려하여 안전성을 확보할 수 있기 때문이다.
of(value)
/ ofNullable(value)
:
of(value)
: 주어진 값으로 Optional
객체를 생성한다.null
이면 NullPointerException
이 발생한다ofNullable(value)
: 주어진 값으로 Optional
객체를 생성한다null
이어도 예외가 발생하지 않는다 Optional<String> nonNullableOptional = Optional.of("Hello");
Optional<String> nullableOptional = Optional.ofNullable(null);
isPresent()
:
true
, 그렇지 않으면 false
를 반환한다. Optional<String> optional = Optional.of("Hello");
if (optional.isPresent()) {
// 값이 존재하는 경우 처리
}
ifPresent(consumer)
:
Consumer
함수형 인터페이스를 인자로 받는다 Optional<String> optional = Optional.of("Hello");
optional.ifPresent(value -> System.out.println("Value : " + value));
// Value : Hello
get()
:
NoSuchElementException
이 발생한다isPresent()
를 함께 사용하는 것이 권장된다 Optional<String> optional = Optional.of("Hello");
String value = optional.get();
// value = "Hello"
orElse(other)
/ orElseGet(supplier)
/ orElseThrow(exceptionSupplier)
orElse(other)
: 값이 존재하면 해당 값을 반환하고, 그렇지 않으면 주어진 기본값을 반환한다orElseGet(supplier)
: 값이 존재하면 해당 값을 반환하고, 그렇지 않으면 Supplier
로 제공된 값을 반환한다orElseThrow(exceptionSupplier)
: 값이 존재하면 해당 값을 반환하고, 그렇지 않으면 주어진 예외를 발생시킨다 Optional<String> optional = Optional.of("Hello");
String result1 = optional.orElse("Default");
String result2 = optional.orElseGet(() -> getDefaultValue()); // 값이 없더라도 기본 값을 넣어주는 것이다.
String result3 = optional.orElseThrow(() -> new NoSuchElementException("No value present"));
filter(predicate)
:
Optional
을 반환하고, 그렇지 않으면 빈 Optional
을 반환한다 Optional<String> optional = Optional.of("Hello");
Optional<String> filteredOptional = optional.filter(value -> value.length() > 5);
map(mapper)
/ flatMap(mapper)
:
map(mapper)
: 값이 존재하면 주어진 매핑 함수를 적용하고, 결과를 포함하는 Optional
을 반환한다flatMap(mapper)
: 값이 존재하면 주어진 플랫맵 함수를 적용하고, 결과를 포함하는 Optional
을 반환한다 (매핑 함수가 Optional
을 반환할 수 있음) Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.map(String::length);
NullPointerException
을 방지하고 코드 안정성을 향상시킬 수 있다.Optional<?>
사용시 실제 인스턴스로 변환하는 과정에서 null 처리를 필요로 한다. Optional<Entity> entity = repository.findById(id);
if (optionalEntity.isPresent()) {
Entity entity = optionalEntity.get(); // Optional<>에 담겼던 실제 인스턴스를 반환한다.
// 메인 로직
}
else {
// Entity가 존재하지 않는 경우 처리 로직
// e.g. throw new Exception();
}
단일 Entity를 반환할 때 Optional<>
을 사용하는 것은 해당 Entity가 존재하지 않을 수 있는 상황을 고려하여 안전성을 확보할 수 있기 때문이다. null에 대해 불확실성이 존재하는 상황 또는 예상치 못한 NullPointException에 대한 대응을 위해 사용이 권장된다.