본문 바로가기

Java

Java Optional<T>

 

- 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