보근은 참고 있다
Optional 본문
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 |