<T>
null
을 간접적으로 다루기 위한 객체null
을 직접 다룰 때 문제점null
을 직접 다루는 것은 위험NullPointerException
발생null
체크 → if
문 필수 → 코드가 지저분해진다.null
을 다룬다.null
이 아니다.<T>
객체 생성하기String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of(null); // ❌ NullPointerException 발생
Optional<String> optVal = Optional.ofNullable(null); // ✅ OK
null
값이 될 수 없는 구조null
값 불가null
값을 넣을려면 ofNullable()
사용null
대신 빈 Optional 객체를 사용Optional<String> optVal = null; // ❌ 바람직하지 않음
Optional<String> optVal = Optional.<String>empty();
// ✅ 빈 객체로 초기화
NullPointerException
을 줄이기 위해 사용get()
orElse()
orElseGet()
orElseThrow()
Optional<String> optVal = Optional.of("abc");
// optVal 에 저장된 값을 반환, null 이면 예외 발생
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);
isPresent()
if(Optional.ofNullable(str).isPresent()) { // if(str!=null)
System.out.println(str);
}
null
이면 false
, 아니면 true
를 반환ifPresent()
Optional.ofNullable(str).ifPresent(System.out::println);
null
이 아닐때만 작업 수행null
이면 아무 일도 안 함public final class OptionalInt {
private final boolean isPresent; // 값이 저장되어 있으면 true
private final int value; // int 타입의 변수
Optional 클래스 | 값을 반환하는 메서드 |
---|---|
Optional<T> | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long getAsLong() |
OptionalDouble | double getAsDouble() |
OptionalInt opt = OptionalInt.of(0); // 0
OptionalInt opt2 = OptionalInt.empty(); // 0
// 구분 가능?
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false
isPresent()
로 구별