[Java] Java8 Optional : orElse, orElseThrow, orElseGet

2023. 10. 30. 14:20·Language/Java
Optional의 예외처리
- orElse(default)는 Optional 값에 null이 들어올 경우에 orElse의 default 값으로 return
- orElseGet(() -> default)은 Optional 값에 null이 들어올 경우에 default 값으로 return
- orElseThrow는 Optional 객체가 비어있을 경우에 예외를 던짐

-> 그렇다면 orElse와 orElseGet의 차이가 없는건가?

 

이거에 대한 내용은 "Optional을 올바르게 사용하기 위한 방법을 제공하는 26가지" 글에 나와있다.

 

26 Reasons Why Using Optional Correctly Is Not Optional - DZone

We take a look at the top 25 most important concepts to keep in mind when working with Optionals in Java, focusing on null variables and more.

dzone.com

 

1. 값이 없는 경우, Optional.orElse()를 통해 이미 생성된 기본 값(객체)을 반환

public static final String MEMBER_STATUS = "UNKNOWN";
Member member = findById(1).orElse(MEMBER_STATUS);
 
Member EMPTY_MEMBER = new Member();
Member member = findById(1).orElse(EMPTY_MEMBER);

단, orElse 메소드의 인자는 Option 객체가 존재할 때도 실행된다.

 

 

2. 값이 없는 경우, Optional.orElseGet()를 통해 기본 값(객체)을 반환

Member member = findById(1).orElseGet(Member::new);

orElseGet(() -> default) 에서 'default'는 Optional에 값이 없을 때만 실행된다.

 

 

3. 값이 없는 경우, Optional.orElseThrow()를 통해 명시적으로 예외을 던짐

값이 없는 경우, 기본 값을 반환하는 대신 예외를 던져야 하는 경우도 있다.

Member member = findById(1).orElseThrow(() -> new NoSuchElementException("Member Not Found"));

 

자바 10부터는 orElseThrow()의 인수 없이도 사용할 수 있다.

    /**
     * If a value is present, returns the value, otherwise throws
     * {@code NoSuchElementException}.
     *
     * @return the non-{@code null} value described by this {@code Optional}
     * @throws NoSuchElementException if no value is present
     * @since 10
     */
    public T orElseThrow() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

 

4. 정리

만약 

findById(1).orElse(new Member());

이런식으로 작성이 된다면, new Member는 무조건 실행이 된다.

따라서 orElse(default)는 'default'가 새 객체 생성이나 새로운 연산을 유발하지 않고,

이미 생성되었거나 계산된 값일 때만 사용해야 한다.

 

 


  • Member::new 는 무엇일까?
 

[Java] ::new 는 무엇일까? Java 8 메소드 레퍼런스 (Method Reference)

온라인 상의 자바 예시 코드를 보면 종종 Member::new 이런식으로 ::new 혹은 다른 메소드로 코드가 짜여진 경우가 있다 1. 메소드 레퍼런스 람다 표현식을 구현할 때 쓸 수 있는 방법으로 기존에 있

repeater2487.tistory.com

 

저작자표시 (새창열림)
'Language/Java' 카테고리의 다른 글
  • [Java] Java8 표준 함수형 인터페이스
  • [Java] ::new 는 무엇일까? Java 8 메소드 레퍼런스 (Method Reference)
  • [Java] 도메인 모델 패턴, 트랜잭션 스크립트 패턴
  • [Java] int와 Integer, boolean과 Boolean
마볼링
마볼링
개발과 게임에 관한 내용을 읽기 쉽게 정리합니다.
  • 마볼링
    게임을 좋아하는 개발자의 블로그
    마볼링
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Project
        • LOATODO
        • 인스타그램 클론코딩(중단)
      • Language
        • Java
        • PHP
        • Javascript
      • Framework & Library
        • Spring
        • Vue
      • Computer Science
        • Web
        • Linux
      • CodingTest
        • Algorithm
        • Kotlin으로 푼 코딩 테스트
        • Java로 푼 코딩 테스트
        • Sorting & Thinking
        • BFS
      • 책&강의 정리
      • 정보처리기사
      • 개인
        • 팰월드(PALWORLD)
        • 마인크래프트
  • 블로그 메뉴

    • 링크

      • GitHub
      • Threads
    • 공지사항

    • 인기 글

    • 태그

      아크 서바이벌
      티스토리챌린지
      Spring
      운영체제
      springboot
      코딩테스트
      jsp
      로아투두
      LoaTodo
      codingtest
      네트워크
      프로그래머스
      Database
      오블완
      CS
      JPA
      error
      php
      java
      이터널 모드
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.1
    마볼링
    [Java] Java8 Optional : orElse, orElseThrow, orElseGet
    상단으로

    티스토리툴바