[Java8]Optional 클래스

Wintering·2022년 5월 16일
0

이펙티브 자바

목록 보기
3/18

Optional 클래스

  • OptionalXXX 클래스
    java.util 패키지의 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스 타입을 일컫는다.
    이들은 값을 저장하는 값 기반 클래스로, 이 객체에서 값을 얻기 위해서는 get(), getAsDouble(), getAsInt(), getAsLong()을 호출한다.

  • Optional은 값이 들어 있을수도, 없을 수도 있는 컨테이너

  • return 값에만 사용을 권장

  • Optional을 return 하는 메소드에서 null을 return하지말자. (empty()를 사용)

  • Collection, Map, Stream, Array, Optional을 Optional로 감싸지 말자. (이미 null값을 판단 가능)


  • Optional 클래스는 단순히 집계 값만 저장하는 것이 아니라, 집계 값이 존재하지 않을 경우의 디폴트 값을 설정할 수 있고, 집계 값을 처리하는 Consumer를 등록할 수 있다.

다음과 같은 코드에서, 컬렉션의 요소가 추가되지 않아서 저장 된 요소가 없으면?

List<Integer> list = new ArrayList<>();
double avg = list.stream()
	.mapToInt(Integer :: intValue)
    .average()
    .getAsDouble();
System.out.println("평균" + avg);

요소가 없으므로, 평균값도 있을 수 없다 👉 NoSuchElementException 예외 발생
이럴 경우! 예외를 피하는 세 가지 방법
1. Optional 객체를 얻어 isPresent() 메소드로 평균값 여부를 확인. isPresent가 True일때만 return
2. orElse() 메소드로 디폴트값을 정해놓는다. 평균값이 없으면 orElse()의 매개값이 디폴트 값
3. ifPresnet() 메소드로 평균값이 있을 경우에만 값을 이용하는 람다식 실행

import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;

public class OptionalExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        /*//예외 발생(java.util.NoSuchElementException)
        double avg = list.stream()
            .mapToInt(Integer :: intValue)
            .average()
            .getAsDouble();
         */

        //방법1
        OptionalDouble optional = list.stream()
                .mapToInt(Integer::intValue)
                .average();
        if (optional.isPresent()) {
            System.out.println("방법1_평균: " + optional.getAsDouble());
        } else {
            System.out.println("방법1_평균: " + 0.0);
        }


        //방법2
        double avg = list.stream()
                .mapToInt(Integer::intValue)
                .average()
                .orElse(0.0);
        System.out.println("방법2_평균: " + avg);


        //방법3
        list.stream()
                .mapToInt(Integer::intValue)
                .average()
                .ifPresent(a -> System.out.println("방법3_평균: " + a));
    }
}

결과
방법1 평균 : 0.0
방법2 평균 : 0.0

0개의 댓글