JAVA

orElseGet 과 orElse 차이

whyWhale 2022. 8. 25.

What

  • Optional의 쓰이는 메소드로서 체이닝 형식으로 사용되어 질 수 메소드이다.
  • 두개의 함수 모두 해당 값이 존재하지 않을 때 라는 의미를 갖는 메소드이다.
Optional<String> name = Optional.ofNullable("엘리자베스");

name.~~~

❓Why

  • 호출로 인해 메모리 상에 이슈가 발생할 수 있다.
  • 혹은 함수를 호출하는데 응답시간에 지연이 생긴다.
  • 결과적으로 createDefault의 호출 여부에 따라 다르다는 것을 알 수 있다.

  • 예제 코드

    package com.programmers.objectstudy;
    
    import java.time.LocalDateTime;
    import java.util.Optional;
    
    public class Main {
        public static void main(String[] args) throws InterruptedException {
    
            testOrElseOfStream();
            System.out.println("===============boundary================");
            testOrElseGetOfStream();
        }
    
        private static void testOrElseGetOfStream() throws InterruptedException {
            Optional<String> name = Optional.ofNullable("엘리자베스");
            System.out.println(getLogTime("orElseGet 시작 시간"));
            name.orElseGet(() -> {
                try {
                    return createDefault();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
            System.out.println(getLogTime("orElseGet 종료 시간"));
        }
    
        private static void testOrElseOfStream() throws InterruptedException {
            Optional<String> name = Optional.ofNullable("엘리자베스");
            System.out.println(getLogTime("orElse 시작 시간"));
            name.orElse(createDefault());
            System.out.println(getLogTime("orElse 종료 시간"));
        }
    
        public static String getLogTime(String prefix) {
            return prefix + " : " + LocalDateTime.now().getSecond();
    
        }
    
        public static String createDefault() throws InterruptedException {
            System.out.println("Main.createDefault 실행 @@@@");
            ;
            Thread.sleep(1000);
            return "DEFAULT_NAME";
        }
    }

✅How[어떻게 써야 잘 쓸까?]

⚠️ 무조건적으로 값이 여부는 상관없이 호출되는 orElse 메소드는 성능의 이슈가 생길 수 있다.

  • orElse문은 되도록이면 피해야 맞는 것이다.(무거운 작업이 진행될 경우에는 더더욱 피해야 한다)

📌 REFER

orElseGet()과 orElse()의 차이

'JAVA' 카테고리의 다른 글

객체 판별  (0) 2021.10.18
동시성  (0) 2021.05.31
Blocking , NonBolocking  (0) 2021.05.23
Enum class  (0) 2021.05.17
인터페이스, 추상클래스  (0) 2021.05.16

댓글