Optional<T> 클래스는 null을 대신하기 위해 만들어진 새로운 데이터 타입으로, T 타입의 객체를 포장해 주는 래퍼 클래스이다.
이러한 Optional 객체를 사용하면 복잡한 조건문 없이도 null 값으로 인해 발생하는 예외를 처리할 수 있게 된다.
API Note:
Optional is primarily intended for use as a method return type where there is a clear need to represent “no result,” and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다. Optional 타입의 변수의 값은 절대 null이어서는 안 되며, 항상 Optional 인스턴스를 가리켜야 한다.
String str = "test";
if (str != null) {
System.out.println(str.charAt(0)));
}
String str = "text";
Optional<String> optStr = Optional.ofNullable(str);
optStr.ifPresent(s -> System.out.println(s.charAt(0));
Optional.empty()
빈 Optional 객체를 생성한다.
Optional.of(value);
value 값이 null이 아닌 경우에 사용한다.
만약 null을 저장하려 하면 NullPointerException 예외가 발생한다.
Optional.ofNullable(value);
value 값이 null인지 아닌지 확실하지 않은 경우에 사용한다.
null 값을 저장하려 하면 비어있는 Optional 객체를 반환한다.
get()
Optionl 객체에 저장된 값을 반환한다.
Optional<Integer> opt = Optional.ofNullable(123);
System.out.print(opt.get());
결과
123
isPresent()
지정된 값이 존재하는지 여부를 boolean 타입으로 반환한다.
Optional<Integer> opt = Optional.ofNullable(123);
if(opt.isPresent()) System.out.println(opt.get());
결과
123
orElse()
지정된 값이 존재하면 그 값을 반환하고 존재하지 않으면 인수로 전달된 값을 반환한다.
👉 값이 존재할 때
String str = getString();
System.out.println(str);
public String getString() {
Optional<String> opt = Optional.ofNullable("test");
return opt.orElse("empty");
}
결과
test
👉 값이 존재하지 않을 때
String str = getString();
System.out.println(str);
public String getString() {
Optional<String> opt = Optional.ofNullable(null);
return opt.orElse("empty");
}
결과
empty
orElseGet()
지정된 값이 존재하면 그 값을 반환하고 존재하지 않으면 인수로 전달된 람다 표현식의 결과값을 반환한다.
Optional<String> opt = Optional.empty();
System.out.println(opt.orElseGet(() -> new String("hello")));
결과
hello
orEleseThrow
저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다.
Optional<String> opt = Optional.empty();
try {
System.out.println(opt.orElseThrow(() -> new Exception()));
} catch (Exception e) {
System.out.println("error");
}
결과
error
ifPresent()
특정 결과를 반환하는 대신에 Optional 객체가 감싸고 있는 값이 존재할 경우에만 실행될 로직을 함수형 인자로 넘긴다.
String str = "text";
Optional<String> optStr = Optional.ofNullable(str);
optStr.ifPresent(s -> System.out.println(s.charAt(0));
- isPresent()-get() 대신 orElse()/orElseGet()/orElseThrow()
- orElse(new ...) 대신 orElseGet(() -> new ...)
- 단지 값을 얻을 목적이라면 Optional 대신 null 비교
- Optional 대신 비어있는 컬렉션 반환
- Optional을 필드로 사용 금지
- Optional을 생성자나 메서드 인자로 사용 금지
- Optional을 컬렉션의 원소로 사용 금지
- of(), ofNullable() 혼동 주의
- Optional 대신 OptionalInt, OptionalLong, OptionalDouble
🤚 아래 블로그에 설명이 잘 나와있다!
http://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/
참고한 곳
http://tcpschool.com/java/java_stream_optional
https://advenoh.tistory.com/15
http://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/