소스분석을 하다가
Optional <CustDTO> ...
CustDTO custDto = custEntity.map(custMapper::toCustDTO).orElse(null);
라는 소스를 봤는데 Optional, 세미콜론 두개와 map이라는 메소드.. 모르는것 투성이... 하나씩 검색을 해봤다.
자바 NPE(NullPointException) 예방
반환 값으로 null을 사용하는 것이 위험하기 때문에 등장한 것이 Optional
Optional는 null이 될 수도 있는 객체을 감싸고 있는 일종의 래퍼 클래스
Optional을 제대로 사용하기 위해서는 Stream처럼 사용해야 한다.
Stream : 람다를 활용할 수 있는 기술 중 하나
Optional 클래스와 Stream 클래스 간에 직접적인 구현이나 상속관계는 없지만 사용 방법이나 기본 사상이 매우 유사
메서드에 전달할 수 있는 동작
메서드와 비슷하지만 특정 클래스에 종속되지 않으며 이름을 갖지 않음.
1. 기존 메서드
int min(int x, int y) { return x < y ? x : y; }
2. 메서드명과 반환 타입 생략
(int x, int y) -> { return x < y ? x : y; }
3. return문 대신 표현식 사용 그리고 중괄호의 생략, 이때는 문장이 아니므로 끝에 세미콜론은 생략
(int x, int y) -> x < y ? x : y
4. 매개변수의 타입이 추론이 가능한 경우 생략
(x, y) -> x < y ? x : y
람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줌(메서드 참조)
// 변수 i가 Math 클래스의 random 이라는 함수를 바라보도록(참조하도록) 함.
MathInterface i = Math::random;
클래스이름::메소드이름
참조변수이름::메소드이름
map 메서드는 매퍼 함수의 반환값을 Optional.ofNullable에 인자로 전달하여 Optional 객체로 만든다.
orElse() 메소드를 호출하여 이 전 과정을 통해 얻은 Optional이 비어있을 경우, 디폴트로 사용할 값 세팅.