public final class Optional<T>
{ // If non-null, the value; if null, indicates no value is present
private final T value;
...
}
Optional.empty() - 값이 비어있는 경우
//Wrapper 클래스이기 때문에 빈 값이 올수도 있다.
Optional<String> optional=Optional.empty();
Optional.of() - 값이 Null이 아닌 경우
//Null을 저장하려고 하면 NullPointerException 발생
Optional<String> optional=Optional.of("MyName");
Optional.ofNullable() -값이 Null일수도 아닐수도 있는 경우
Optional<String> optional=Optional.ofNullable(getName());
String name= optional.orElse(""); //값이 없다면 "" 리턴
Optional은 Wrapping하고 다시 풀고, null일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못하면 성능이 저하될수 있다. 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다.
// ABCD
Optional.of("ABCD").filter(v -> v.startsWith("AB")).orElse("Not AB");
// Not AB
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB");
// xyz -> 소문자로 변환
Optional.of("XYZ").map(String::toLowerCase).orElse("Not AB");
Optional.of("TEST").isPresent(); // true
// TEST 출력
Optional.of("TEST").ifPresent(System.out::println);
// 아무것도 출력되지 않음
Optional.ofNullable(null).ifPresent(System.out::println);
Optional.of("TEST").get(); // "TEST" 리턴
Optional.ofNullable(null).get(); // NoSuchElementException
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB");
// "Not AB" 리턴
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElseGet(() -> "Not AB");
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElseThrow(NoSuchElementException::new);