T 타입 객체의 Wrapper 클래스
public final class Optional<T>{
private final T value; // T타입의 참조 변수
}
※null을 직접 다루기에는 위험!
String str = null; ( x )
String str = ""; ( o )
int[] arr = null; ( x )
int[] arr = new int[0]; ( o )
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);
Optional<String> optVal = null ; // ok. 하지만 바람직 X
Optoin<String> optVal = Optional.<String>empty() // ( o , <String> 생략 가능)
Optional<String> optval = Optional.of("abc");
String str1 = optVal.get(); //optVal에 저장된 값을 반환, null이면 예외 발생. get() 사용하려면 try-catch로 예외 처리 해줘야함.
String str2 = optVal.orElse(""); //optVal에 저장된 값을 반환, null이면 ""을 반환
String str2 = optVal.orElseGet(String :: new); //람다식 사용가능 , String :: new == () -> new String()
// 1번 방식
if(Optional.ofNullable(str).isPresent()){ // if(str!=null)
System.out.println(str);
}
// 2번 방식 ifPresent(Consumer) null이 아닐때만 작업 수행, 널이면 아무 일도 안 함
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 opt2 = OptionalInt.empty();
System.out.println(opt.getAsInt()); //0
System.out.println(opt2.getAsInt()); // NoSuchElementException
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false