- T 타입의 객체를 감싸는 래퍼 클래스
1. Optional<T> 객체 생성
- of()로 생성
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(new String("abc"));
- 참조변수의 값이 Null일 가능성이 있는 경우 ofNullable()를 사용하여 생성
Optional<String> optVal = Optional.of(null); // NullPointerException 발생
Optional<String> optVal = Optional.ofNullable(null); // OK
- Optional<T> 타입의 참조변수를 기본값으로 초기화 하는 경우, empty() 사용
Optional<String> optVal = null; // null로 초기화 하는 것은 바람직하지 않음
Optional<String> optVal = Optional.<String>empty();
2. Optional<T> 객체의 값 가져오기
- get()을 사용하여 값을 가져옴
- 값이 null인 경우 NoSuchElementException 발생(orElse(), orElseGet(), orElseThrow()으로 처리 필요)
Optional<String> optVal = Optional.of("abc");
// optVal에 저장된 값 반환
String str1 = optVal.get();
// optVal이 null인 경우 대체할 값 지정, ""반환
String str2 = optVal.orElse("");
// optVal이 null인 경우 람다식 지정, () -> new String()
String str3 = optVal.orElseGet(String::new);
// optVal이 null인 경우 예외 지정, 예외 발생
String str4 = optVal.orElseThrow(NullPointerException::new);
- isPresent(), ifPresent(Consumer<T> block)을 이용하여 null 값인 경우 값 가져오는 방법
// isPresent()는 값이 null인 경우 false, null이 아닌 경우 true를 반환
if(Optional.ofNullable(str).isPresent()) {
System.out.println(str);
}
// ifPresent(Consumer<T> block)는 값이 있으면 주어진 람다식을 수행하고, 없으면 아무 일도 하지 않음
Optional.ofNullable(str).ifPresent(System.out::println);
3. 기본형 값을 감싸는 래퍼 클래스 - OptionalInt, OptionalLong, OptionalDouble
- Optional<T> 를 사용해도 되지만 성능을 위해 사용
1) 값 가져오는 방법
Optional 클래스 | 값을 반환하는 메서드 |
Optional<T> | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long getAsLong() |
OptionalDouble | double getAsDouble() |
2) 빈 Optional 객체와 비교
Optional opt = OptionalInt.of(0); // OptionalInt에 0 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0 저장
System.out.println(opt.isPresent()); // true
System.out.println(op2t.isPresent()); // false
System.out.println(opt.equals(opt2)); // false
'Java' 카테고리의 다른 글
Java 네트워킹(networking) (0) | 2023.01.26 |
---|---|
Java 입출력(I/O) (0) | 2023.01.26 |
Java 스트림(stream) (0) | 2023.01.20 |
Java 람다(Lambda) (0) | 2023.01.17 |
Java 스레드(thread) (0) | 2023.01.17 |