카테고리 없음
[java 1.8] Optional을 이용한 null 처리
개발자인 경우
2021. 7. 14. 16:31
Optional
자바 1.8 버전 이후로 추가된 함수지향 메소드
사용 이유
- null 처리의 간소화
- 특정 데이터의 필터링
- null 이 가능한 데이터의 명시적인 표현
- 가독성 향상
null 처리 간소화
ex) 기존 방식
if(someClassInstace ! = null
&& someClassInstace.innerObject ! = null
&& someClassInstace.innerObject.memberData ! = null
&& someClassInstace.innerObject.memberData > 5){
// 로직
}else{
// 예외 처리
}
ex) Optional 처리
Optional.of(someClassInstance) // null 이면 orElseThrow
.map(x -> x.innerObject) // null 이면 orElseThrow
.map(x -> x.memberData) // null 이면 orElseThrow
.filter(x -> x > 5) // 5보다 작다면 orElseThrow
.orElseThrow(()->new RuntimeException("에러 메시지"));
// 로직
Optional 메소드 리스트
1. of
// 객체가 null이 아닐 때 사용하는 함수 Optional.of()
// 해당 함수는 a 라는 객체가 null이면 nullpointException 발생
Optional<ClassA> optA = Optional.of(a);
2. ofNullable
// a가 null이 가능할때 사용
// a가 null이 들어와도 NPE 예외 발생 x
// 대신 null인 a클래스를 Optional 클래스로 래핑함
Optional<ClassA> optA = Optionl.ofNullable(a);
3. orElse
// getA 값이 있던 없던 항상 default A
String a = optA.map(ClassA::getA).orElse("default A");
4. orElseGet
// getA 값이 null 이면 default A 값을 할당하는 코드
String a = optA.map(ClassA::getA).orElseGet("default A");
5. map
이전 인자 (of, nullOf)에서 특정 데이터로 변경(접근)하는 함수
SomeClass someInstance = new SomeClass();
String name = Optional.of(someInstance) // 인스턴스 null 체크
.map(SomeClass::getName) // 멤버 null 체크
.orElseGet(()->"default name"); // 값이 null일 때 설정한 값 리턴
6. filter
데이터에 필터(조건)을 걸어 데이터 전처리
SomeClass someInstance = new SomeClass();
String name = Optional.of(someInstance) // 인스턴스 null 체크
.map(SomeClass::getName) // 멤버 null 체크
.filter(x->!x.empty())
.orElseGet(()->"default name"); // 값이 null일 때 설정한 값 리턴