본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.
null
체크를 깜빡한다.null
을 리턴한다. null
을 리턴한다.null
을 직접 다루기는 위험하기 때문에 간접적으로 다루기null
체크를 하려면 if
를 사용해야 하는데, 코드가 지저분해진다. 하지만 Optional을 사용하면 코드가 깔끔해짐.리턴값으로만 쓰기를 권장
Optional을 리턴하는 메소드에서 null
을 리턴하지 말자.
Optional
을 쓰는 이유가 없어진다. 정말 리턴할게 없다면 Optional.empty()
리턴기본형 타입용 Optional
이 따로 있다.(OptionalInt
, OptionalLong
, OptionalDouble
)
Collection, Stream, Optional은 Optional
로 감싸지 말 것.
null
일 수 있다는 의미를 내포하는데, 굳이 또 Optional
을 감쌀 필요가 없다. 2번 감싸는 꼴이 되버림.Optional.of(객체)
Optional.of(null) //NullPointerException 발생
Optional.ofNullable(null) //가능
Optional.empty()
isPresent()
isEmpty() (자바 11부터 제공)
if(optional.isPresent()){
System.out.println("값이 있습니다.");
}
if(optional.isEmpty()){
System.out.println("값이 없습니다.");
}
NoSuchElementException
발생Optional<String> optional = Optional.of("Optional입니다.");
String str = optional.get();
optional.ifPresent(oc -> System.out.println(oc.getTitle()));
ifPresent
로 하기에는 할 작업량이 많아서, 무조건 값을 꺼내야 하는 경우에 사용.orElseGet
을 사용한다. (아래 참고)OnlineClass onlineClass=optional.orElse(new OnlineClass()); //값이 있든 없든 객체 생성은 된다.
OnlineClass onlineClass=optional.orElseGet(()->new OnlineClass()); //값이 있으면 Supplier이 실행되지 않는다.
OnlineClass onlineClass=optional.orElseThrow(IllegalStateException::new)
false
면 버리고, true
면 다음거 실행Optional<OnineClass> op=optionals.stream()
.filter(oc -> oc.getTitle().startWith("spring"))
.findFirst();
stream map
과 마찬가지로, 값을 내가 원하는 형태로 변환할 수 있다.
Optional map(Function)
//Optional<OnlineClass>를 Optional<Integer>로 바꿀 수 있다.
Optional<Integer> integer=optional.map(OnlineClass:getId);
OptionalInt opt=OptionalInt.of(0); //0을 저장
OptionalInt opt2=OptionalInt.empty(); //0을 저장
opt.isPresent(); //true
opt2.isPresent(); //false
opt.equals(opt2); //false