*Optional
람다식을 공부하면서 stream() 과 filter() 메소드를 공부하다 추가적으로 optional 에 대해 정리해볼까 한다.
stream 의 최종 연산으로 Optional 을 반환하는 경우가 많다.
(optional 특징으론 null 값이어도 반환이 가능하다는 점)
optional 객체를 생성하거나 optional 로 감싸서 값을 반환할 때
Optional.ofNullable를 사용하여 optional 객체를 생성, 반환 하면 null 인 경우에도 NPE를 발생시키지 않고 empty 객체로 초기화 된다.
ex)
public static void ofNullable(String[] args) {
Optional<String> op1 = Optional.ofNullable(null) ;
(물론 ofNullable 이 아닌 Optional.of로 반환 및 생성을 하게 되면 null NPE를 발생시킨다.)
ex)
public static void of(String[] args) {
Optional<String> op2 = Optional.of(null); // NullPointException
get() , orElse() , orElseGet() , orElseThrow()
Optional에 담긴 value를 가져올 땐 , get(), orElse(), orElseGet()을 사용한다.
get()의 경우 value 값 자체를 반환 , null 일 경우에는 NoSuchElementException 을 발생시킨다.
NoSuchElememtException을 방지하며 value 값을 가져오는 방법이 orElse() , orElseGet()이다.
orElse()는 예외 시 대신하여 리턴할 값을 지정 , orElseGet은 인자로 받은 supplier를 실행한다.
혹은 NoSuchElemntException 이외의 에외를 발생시키고자 할 경우에는 orElseThrow()를 사용할 수 있다.
filter(), map(), flatMap()
아래 예제와 같이 사용할 수 있다.
ex)
public class opRepository {
private static Map<Member> MList = new HashMap<>(); // Member 객체 리스트
public Member save(Member member) {
MList.put(member); // MList에 member 저장
return member;
}
public Optional<Member> findName(String name) {
return MList.value().stream()
.filter(member -> member.getName().equals(name)).findAny(); // MList 의 valuer 값 (member) 에서 getName() 값이 파라미터 name 값과 같은지 비교 후 return
// (findAny() 는 찾은 첫번째 값이 아니라 병렬 처리 될 때는 찾은 값 중 먼저 찾은 값이 return 됨)
class Member {
private final String name ;
private final String id ;
}
isPresent(), ifPresent() , ifPresentOrElse()
단순히 optional vlaue 값이 null 인지 확인 할 때는 isPresent()를 사용 하면 값 존재 여부를 boolean값을 반환하고,
ifPresent(Consumeraction)은 null이 아닐 경우에만 action을 실행한다.
ifPresent(Consumer action, Runnable emptyAction)는 value가 null인 경우 처리할 로직과 null이 아닌 경우 처리할 로직을 모두 넘길 수 있다.
isNull(), nonNull(), requireNonNull()
자바에서 제공하는 Objects 클래스의 값을 비교할 수 있는 메소드다.
자바에서 직접 적인 값==null 비교를 방지하기 위해 빠른 실패를 하기위해 제공하는 메소드라 할 수 있다.
요즘은 null 값을 포용 (?) , 일일히 null 여부를 체크하지 않도록 Optional로 감싸서 작성하는 코드가 많다고 한다.
습관적으로 if 문을 사용해서 null 값 유무를 체크했는데 optional로 감싸서 코딩하는 습관을 가져보려고 정리하는 글을 적어봤다.
객체를 optional로 감싸서 사용하는게 익숙치 않아서 문법을 좀 버벅일 거 같긴 하지만 계속 들여다보면서 코딩하다보면 이또한 익숙해지겠지 싶은 생각이다 ..
[참조][링크텍스트](https://www.blog.ecsimsw.com/entry/작성-중-Optional과-null)