값이 있을 수도 없을 수도 있는 컨테이너를 뜻합니다.
String str = null;
System.out.println(str.indexOf("a")); // NullPointerExecption 발생
String str = null;
// 방법1. 예외를 던진다 → 에러가 발생하면, stackTrace를 찍는다. 즉, 리소스 낭비이다
if(str == null) {
throw new IllegalStateException(); // 에러 처리를 강제하게 됨
}
System.out.println(str.indexOf("a"));
// 방법2. 클라이언트 코드에서 null을 확인한다 → 이는 클라이언트에서 놓친다면 에러가 발생할 수 있다
if(str != null) {
System.out.println(str.indexOf("a"));
}
// 방법3. Optional을 리턴한다 (자바 8부터) → 빈 값이 들어올수도 있음을 클라이언트에게 명시 후, 빈 값인 경우에 대한 처리를 강제한다.
Optional<String> strOptinal = Optional.ofNullable(str);
-이렇게 되면 Optional을 써서 얻는 메리트가 사라집니다.
public void setParameter(Optional<Object>param){
if(param != null)
param.ifPresent(p-> this.param = p);
}
// Optional<Node> node; // 이렇게 사용하지 않는다.
/////////////////////////////////////////
// delegation을 사용한다.
// 참조 객체를 통해 메서드를 호출하는 방식을 사용한다.
Node node = node.getNode();
/////////////////////////////////////////
// Node 클래스에 정의되어 있는 메서드
public Optional<Node> getNode() {
return Optional.empty();
}
Optional.of(10); // 내부에서 (un)boxing이 이루어진다 → 성능에 좋지 않다.
OptionalInt.of(10); // 각 primitive 타입에 맞는 클래스를 제공하므로 이를 사용하는 것을 권장한다.
public Optional<Object> getParam() {
// return null; // 이렇게 사용하지 않는다. → getParam 이후 ifPresent() 실행 시, NullPointerException 발생 가능성이 있음
return Optional.empty(); // null을 담고 있는 Optional 객체를 반환하자.
}
-Optional 안에 들어있는 인스턴스가 Optioanl인 경우 사용하면 유용합니다.
// map을 사용한 경우
Optional<Optional<String>> str = optionalOnlineClass.map(OnlineClass::getOptionalString);
Optional<String> optionalString = str.orElse(Optional.empty());
// flatMap을 사용한 경우
Optional<String> optionalStringByFlatMap = optionalOnlineClass.flatMatp(OnlineClass::getOptionalString);