public final class Optional<T>{
private final T value; // T타입의 참조변수(모든 종류의 객체 저장 가능)
...
}
-> 간접적으로 null을 다룬다. 다루고 있는 객체의 null값을 Optional 객체 안에 넣는다.
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(null); // NullPointerException
Optional<String> optVal = Optional.ofNullable(null); // OK
Optional<String> optVal = null; // 널로 초기화. 바람직하지 않음
Optional<String> optVal = Optional.empty(); // 빈 객체로 초기화. 바람직.
Optional<String> optVal = Optional.of("abc");
// optVal에 저장된 값을 반환. null이면 예외 발생.
// 예외 처리 해야하므로 거의 사용 X
String str1 = optVal.get();
// optVal에 저장된 값이 null일 때는 ""를 반환 (많이 사용)
String str2 = optVal.orElse("");
// 람다식 사용가능 () -> new String() (많이 사용)
String str3 = optVal.orElseGet(String::new);
// Null이면 예외발생
String str4 = optVal.orElseThrow(NullPointerException::new);
if(Optional.ofNullable(str).isPresent()) { // if(str != null)
System.out.println(str);
}
- 아래와 같이 작성할 수도 있다.
// ifPresent(Consumer) - Null이 아닐때만 작업 수행, Null이면 아무일도 안함
// System.out::println == (v) -> (System.out.println(v))
Optional.ofNullable(str).ifPresent(System.out::println);
public final class OptionalInt{
...
private final boolean isPresent; // 값이 저장되어 있으면 true
private final int value; // int 타입의 변수
}
OptionalInt opt = OptionalInt.of(0); // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false