변수 선언
//null을 담고있는(비어있는) Optional 객체
Optional<T> 변수명 = Optional.empty();
//null이 아닌 객체름 담는 Optional 객체, null이 넘어오면 NPE를 던지므로 조심해서 사용해야 한다.
Optional<T> 변수명 = Optional.of(param);
//null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성, null이 넘어올 경우 NPE를
던지지 않고, 비어있는 Optional 객체를 얻어온다.
Optional<T> 변수명 = Optional.ofNullable(변수);
Optional이 담고 있는 객체 접근
//Optional 이 담고 있는 객체 접근
.get()
//비어있는 Optional 객체에 대해서 other를 반환
.orElse(T other)
//비어있는 Optional 객체에 대해서, 넘어온 인자를 반환
.orElseGet(Supplier<? extends T> other)
//비어 있는 Optional 객체에 대해 함수형 인자를 통해 생성된 객체를 반환
//비어있는 경우에만 호출되기 때문에 orElse 보다 성능상 이점을 기대할 수 있다.
.orElseThrow(Supplier<? extends X> exceptionSupplier)
Optional이 객체를 담고 있는지 확인
//Optional이 null을 담고있는지 확인(Optional 사용시에는 비추천하는 메소드이다)
Optional<Member> member = Optional.ofNullable(new Member());
member.isPresent(); // true or false return
Optional을 사용하는 이유는 스트림 "처럼" 사용하기 위함이 크다. 따라서 아래와 같이 사용할 수 있다.
public String getCityOfMemberFromOrder(Order order) {
return Optional.ofNullable(order)
.map(Order::getMember)
.map(Member::getAddress)
.map(Address::getCity)
.orElse("Seoul");
}
Optional 의 filter 를 활용
public Optional<Member> getMemberIfOrderWithin(Order order, int min) {
return Optional.ofNullable(order)
.filter(o -> o.getDate().getTime() > System.currentTimeMillis() - min * 1000)
.map(Order::getMember);
}
filter() 메소드는 넘어온 함수형 인자의 리턴 값이 false인 경우, Optional을 비워버리므로 그 이후 메소드 호출은 의미가 없어지게 된다.
또한 메소드의 리턴값이 Optional으로, 메소드를 사용하는 클라이언트에서 널값이 있을수도 있음을 고려하도록 해준다.
출처: www.daleseo.com/java8-optional-effective/
'JAVA' 카테고리의 다른 글
JPA @ManyToMany (0) | 2021.04.23 |
---|---|
JPA @Inheritance (0) | 2021.04.23 |
JPA CASCADE 종류 (0) | 2021.04.22 |
자바에서 제공하는 함수형 인터페이스 (0) | 2021.03.18 |
자바 스트림 기초 사용법 (0) | 2021.03.17 |