본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.
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