java study _ optional

도연·2023년 6월 7일
0

moyeon_java-study

목록 보기
1/2

*Optional

람다식을 공부하면서 stream() 과 filter() 메소드를 공부하다 추가적으로 optional 에 대해 정리해볼까 한다.

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

Optional의 value 값

get() , orElse() , orElseGet() , orElseThrow()

Optional에 담긴 value를 가져올 땐 , get(), orElse(), orElseGet()을 사용한다.
get()의 경우 value 값 자체를 반환 , null 일 경우에는 NoSuchElementException 을 발생시킨다.
NoSuchElememtException을 방지하며 value 값을 가져오는 방법이 orElse() , orElseGet()이다.
orElse()는 예외 시 대신하여 리턴할 값을 지정 , orElseGet은 인자로 받은 supplier를 실행한다.
혹은 NoSuchElemntException 이외의 에외를 발생시키고자 할 경우에는 orElseThrow()를 사용할 수 있다.

Optional value 처리, 가공하기

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 ; 
    }

Optional의 value 값이 null 인지 확인하기

isPresent(), ifPresent() , ifPresentOrElse()

단순히 optional vlaue 값이 null 인지 확인 할 때는 isPresent()를 사용 하면 값 존재 여부를 boolean값을 반환하고,
ifPresent(Consumeraction)은 null이 아닐 경우에만 action을 실행한다.
ifPresent(Consumer action, Runnable emptyAction)는 value가 null인 경우 처리할 로직과 null이 아닌 경우 처리할 로직을 모두 넘길 수 있다.

object

isNull(), nonNull(), requireNonNull()
자바에서 제공하는 Objects 클래스의 값을 비교할 수 있는 메소드다.
자바에서 직접 적인 값==null 비교를 방지하기 위해 빠른 실패를 하기위해 제공하는 메소드라 할 수 있다.

요즘은 null 값을 포용 (?) , 일일히 null 여부를 체크하지 않도록 Optional로 감싸서 작성하는 코드가 많다고 한다.
습관적으로 if 문을 사용해서 null 값 유무를 체크했는데 optional로 감싸서 코딩하는 습관을 가져보려고 정리하는 글을 적어봤다.
객체를 optional로 감싸서 사용하는게 익숙치 않아서 문법을 좀 버벅일 거 같긴 하지만 계속 들여다보면서 코딩하다보면 이또한 익숙해지겠지 싶은 생각이다 ..

[참조][링크텍스트](https://www.blog.ecsimsw.com/entry/작성-중-Optional과-null)

profile
모연

0개의 댓글