Optional
- 결과가 null 이 절대 나올 수 없을 경우에는 사용하지 않는다.
- Null 에 의해 오류가 발생할 가능성이 매우 높을때만 반환값으로 사용한다.
- Optional 의 값을 확인하지 않고 접근하면 NPE 대신 NoSuchElementException 이 발생할 수 있다.
[ 올바른 Optional 사용법 가이드 ]
- Optional 변수에 Null을 할당하지 말아라
- 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라
- 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라
- 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라
- Collection의 경우 Optional이 아닌 빈 Collection을 사용하라
- 반환 타입으로만 사용하라
https://mangkyu.tistory.com/70 - 1편
https://mangkyu.tistory.com/203 - 2편
Optional<String> optional = Optional.empty();
System.out.println(optional); // Optional.empty
System.out.println(optional.isPresent()); // false
- Null 이 절대 아닌 경우
- Optional.of 를 사용
- Null 을 저장하려고 하면 NPE 발생
- Optional.ofNullable() : 값이 Null 일 수도, 아닐수도 있을 경우
// Optional의 value는 값이 있을 수도 있고 null 일 수도 있다.
Optional<String> optional = Optional.ofNullable(getName());
String name = optional.orElse("anonymous");
// 값이 없다면 "anonymous" 를 리턴
List<String> nameList = Optional.ofNullable(getNames())
.orElseGet(() -> new ArrayList<>());
// getNames() 의 값이 null 이면 함수 실행
orElse() : 파라미터로 값을 받는다.
orElseGet() : 파라미터로 함수형 인터페이스(함수) 를 받는다.
orElse와 orElseGet의 차이점 및 사용법 정리
orElseGet은 값이 준비되어 있지 않은 경우, orElse는 값이 준비되어 있는 경우에 사용
- orElse
- 파라미터로 값을 필요로한다.
- 값이 미리 존재하는 경우에 사용한다. - orElseGet
- 파라미터로 함수(함수형 인터페이스)를 필요로 한다.
- 값이 미리 존재하지 않는 거의 대부분의 경우에 orElseGet을 사용하면 된다.
+ 더블콜론(참조)
:: -> 왼쪽 객체의 오른쪽 메소드를 사용한다는 의미
인스턴스 :: 메소드명 ( or new )
타겟레퍼런스 :: 메소드명
@Test
@DisplayName("orElse 는 값이 null 일때 어떻게 조회?")
void test1() {
Object result = Optional.ofNullable(null)
.orElse(test()); // 파라미터로 넘기기 때문에 호출된다.
System.out.println("result = " + result);
//called
//result = yoonjong
}
@Test
@DisplayName("orElse 는 값이 null이 아닐때 어떻게 조회?")
void test2() {
String result = Optional.ofNullable("값이 있음")
.orElse(test()); // 파라미터로 넘기기 때문에 호출된다.
System.out.println("result = " + result);
//called
//result = 값이 있음
}
@Test
@DisplayName("orElseGet 는 값이 null일 때 어떻게 조회?")
void test3() {
Object result = Optional.ofNullable(null)
.orElseGet(this::test); // 값이 없으므로, 함수를 호출한다.
System.out.println("result = " + result);
//called
//result = yoonjong
}
@Test
@DisplayName("orElseGet 는 값이 null이 아닐때 어떻게 조회?")
void test4() {
String result = Optional.ofNullable("값이 있음")
.orElseGet(this::test); // 함수를 호출하지 않으므로 무시된다.
System.out.println("result = " + result);
// result = 값이 있음
}
private String test() {
System.out.println("called");
return "yoonjong";
}
'Language > JAVA' 카테고리의 다른 글
Null , isEmpty , isBlank 비교 (0) | 2024.03.20 |
---|---|
[JAVA] 깊은 복사 vs 얕은 복사 (0) | 2023.08.20 |
스트림의 중간, 최종연산 (0) | 2023.02.15 |
스트림(Stream) 의 특징 (0) | 2023.02.13 |
람다식과 함수형 인터페이스 (0) | 2023.02.13 |
댓글