Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

보근은 참고 있다

Optional 본문

Language/자바

Optional

보근 2020. 10. 31. 23:02

 

 

 

 

 

 

 

Optional

 

 Optional은 null이 아닌 값을 포함할 수도, 포함하지 않을 수도 있는 컨테이너 객체이다. 주로 리턴값에 쓰인다. 넘겨줄 값이 빈 값일 수도 있다고 알려주고 클라이언트는 그에 맞춰 처리를 진행한다. 

 

 

 

 

 

 

 Optional 객체를 만드는 메서드

  • Optional.of() - null이 아닌 값을 받아 Optional로 감싼다.
  • Optional.ofNullable() - null을 받을 수도 있다. 만약 null이라면 빈 Optional 객체를 반환한다.
  • Optional.empty() - 빈 Optional 객체를 반환한다. ( = 기본 생성자, Optional.ofNullable()에 null값을 넣었을 때)e

ex) ----------------------------------------------------------------------------------------

 

A a = new A();

 

Optional<A> a1 = Optional.of(a);  // a가 null이면 NPE를 던진다.

Optional<A> a2 = Optional.ofNullable(a);

Optional<A> a3 = Optional.empty();  // 빈 Optional 객체를 반환.

 

--------------------------------------------------------------------------------------------

 

 

 

 

 

 

 값을 꺼내는 메서드

  • get() - 값을 꺼낸다.
  • orElse(T) - 값이 존재하면 꺼내고, 없으면 T를 반환.
  • orElseGet(Supplier) - 값이 존재하면 꺼내고, 없으면 Supplier의 반환값을 반환
  • orElseThrow(Supplier) - 값이 존재하면 꺼내고, 없으면 Supplier가 만드는 Exception을 던진다.

ex) ----------------------------------------------------------------------------------------

 

Optional.of("Hello").get();  // "Hello"를 반환.

 

Optional.of("Hello").orElse("hi");  // "Hello"를 반환.

Optional.empty().orElse(other);  // other가 반환됨.

 

Optional.of("Hello").orElseGet(() -> "Hi");  // "Hello"를 반환.

Optional.empty().orElseGet() -> "Hi");  // "Hi"를 반환.

 

Optional.of("Hello").orElseThrow(() -> new NoSuchElementException());  // "Hello"를 반환.

Optional.empty().orElseThrow(() -> new NoSuchElementException());  // 예외를 던짐.

 

--------------------------------------------------------------------------------------------

 

 

 

 

 

 

  값의 존재 유무를 판단하는 메서드

  • isPresent() - 값이 존재하면 true, 없으면 false.
  • isEmpty() - 값이 없으면 true, 있으면 false.
  • ifPresent(Consumer) - 값이 존재하면 값과 함께 지정된 Consumer를 적용, 없으면 do nothing.

ex) ----------------------------------------------------------------------------------------

 

Optional<A> o1 = Optional.of(new A());

Optional<A> o2 = Optional.empty();

 

o1.isPresent();  // true

o2.isPresent();  // false

 

o1.isEmpty();  // false

o2.isEmpty();  // true

 

o1.ifPresent(System.out::println);  // o1 안의 A 객체 참조값 출력.

o2.ifPresent(System.out::println);  // 동작을 안함.

 

-------------------------------------------------------------------------------------------- 

 

 

 

 

 

 

 

 값을 변환하는 메서드

  • map(Function) - 값이 존재하면, Function 함수를 적용한다. 결과값이 null이 아니라면 Optional로 값을 감싼 객체를, null이라면 빈 Optional 객체를 반환한다.
  • flatMap(Function) - 전체적으로 map()과 비슷하지만, flatMap()은 Function의 반환값이 Optional<U>이다. Optional 안에 Optional 객체가 있을 때 사용하면 한꺼풀이 벗겨지는 효과.

ex) ----------------------------------------------------------------------------------------

 

Optional.of(3).map(x -> x+3);  // Optional[6] 반환.

Optional.empty().map(x -> x);  // Optional.empty() 반환.

 

Optional.of(3).flatMap(x -> x+3);  // Optional[6] 반환.

Optional.empty().flatMap(x -> x);  // Optional.empty() 반환.

Optional.of(Optional.of(3)).flatMap(x -> x+3)  // Optional[6] 반환.

 

-------------------------------------------------------------------------------------------- 

 

 

 

 

 

 

 값을 거르는 메서드

  • filter(Predicate) - 값이 존재하고, Predicate에 일치하면, Optional로 값을 감싼 객체를 반환. null이거나, Predicate에 불일치하면 빈 Optional 객체를 반환.

ex) ----------------------------------------------------------------------------------------

 

Optional.of(3).filter(x -> x >= 3);  // Optional[3] 반환.

Optional.empty().filter(x -> x >= 3);  // Optional.empty() 반환.

Optional.of(2).filter(x -> x >= 3);  // Optional.empty() 반환.

 

-------------------------------------------------------------------------------------------- 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Language > 자바' 카테고리의 다른 글

자바의 Upcasting과 Downcasting  (0) 2021.07.18
String vs StringBuilder vs StringBuffer  (0) 2021.07.17
Functional Interface  (0) 2020.11.01
Stream  (0) 2020.10.31
SOLID (객체 지향 설계 원칙)  (0) 2020.10.28
Comments