public final class Optional<T> {
// If non-null, the value; if null, indicates no value is present
private final T value;
...
}
// Optional의 value는 값이 있을 수도 있고 null 일 수도 있다.
Optional<String> optional = Optional.ofNullable(getName());
String name = optional.orElse("anonymous");// 값이 없다면 "anonymous" 를 리턴
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
if(opt.isPresent()) {
System.out.println(opt.get());
}
다음과 같은 메소드를 이용하면 null대신에 대체할 값을 지정할 수 있다.
orElse() : 저정된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환
orElseGet() : 저정된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다표현식의 결과값을 반환
orElsetThrow() : 저정된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생
orElseGet : 값이 null일때만 호출된다. 매개변수로 Supplier를 취한다.
JpaRepository에서 findBy~ 메서드는 Optional을 리턴한다.
/**
* Retrieves an entity by its id.
*
* @param id must not be {@literal null}.
* @return the entity with the given id or {@literal Optional#empty()} if none found.
* @throws IllegalArgumentException if {@literal id} is {@literal null}.
*/
Optional<T> findById(ID id);
// Optional로 값을 리턴하기때문에 null일경우 exception을 날리고 아닌경우에 객체를 받을수있다.
Post post = postsRepository.findById(id)
.orElseThrow(() -> new PostNotFoundException(id));