본문 바로가기
자바

[Java] 자바의 Optional 클래스

by 책 읽는 개발자_테드 2021. 7. 21.
반응형

 

Optional 클래스란?

NullPointerException 예외를 회피하기 위한 다양한 메소드를 제공하는 클래스

public final class Optional<T> extends Object

저장하는 값의 타입만 다르고 제공하는 기능은 동일한 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스가 존재

▶ Funtional 언어인 Haskell과 Scala에서 제공하는 기능을 따 온 것

java.util 패키지 소속 

제공 메서드

리턴타입 메서드 설명
boolean isPresent()  · Optional 클래스가 비어 있는지 확인
Optional<T> empty() · 데이터가 없는 Optional 객체 생성
Optional<T> of() · 반드시 데이터가 들어있는 Optional 객체 생성
Optional<T> ofNullable() · null일 수 있는 ptional 객체 생성
T get() · 값이 저장되어 있지 않은 경우 null 리턴
T orElseGet() · 값이 저장되어 있지 않은 경우 매개변수로 입력된 Supplier가 실행되어 값을 리턴
T orElse(T)

· 값이 저장되어 있지 않은 경우 디폴트 값 지정
double orElse(double)
int orElse(int)
long orElse(long)


void
ifPresent(Consumer)

· 값이 저장되어 있는 경우 Consumer에서 처리
ifPresent(DoubleConsumer)
ifPresent(IntConsumer)
ifPresent(LongCunsumer)


사용예시

 

▶ empty, of, ofNullable 메서드로 Optional 객체 생성

import java.util.Optional;

public class createOptionalObj {
    public static void main(String[] args){
        Optional<String> emptyString = Optional.empty();
        String common = null;
        Optional<String> nullableString = Optional.ofNullable(common);
        common="common";
        Optional<String> commonString = Optional.of(common);
    }
}

 

▶ get(), orElse(), orElseGet(), orElseThrow() 메서드로 Optional 데이터 꺼내기

private void getOptionalData(Optional<String> data) throws Exception {
    String defaultValue = "default";
    String result = data.get();  //1.
    String result2 = data.orElse(defaultValue);  //2.
    Supplier<String> stringSupplier = new Supplier<String>() {
        @Override
        public String get(){
            return "GodOfJava";
        }
    }
    String result3 = data.orElseGet(stringSupplier);  //3.
    Supplier<Exception> exceptionSupplier = new Supplier<Exception>() {
        @Override
        public Exception get() {
            return new Exception();
        }
    };
    String result4 = data.orElseThrow(exceptionSupplier);  //4.
}

▶ isPresent 메소드로 평균값 여부 확인 - 컬렉션 요소의 평균 구하기

List<Integer> list = Arrays.asList(1,2,3,7);

OptionalDouble optionalDouble = list.stream()
       .mapToInt(Integer :: intValue)
       .average();

if (optionalDouble.isPresent()){
   System.out.println("평균: " + optionalDouble.getAsDouble());
}else{
   System.out.println("값이 존재하지 않아요.");
}

 

▶ orElse 메소드로 디폴트 값 정하기 - 컬렉션 요소의 평균 구하기

List<Integer> list = Arrays.asList(1,2,3,7);

double avg = list.stream()
       .mapToInt(Integer :: intValue)
       .average()
       .orElse(0.0);

System.out.println("평균: " + avg);

 

▶ ifPresent 메소드로 평균값이 있을 때만 값을 이용하기 - 컬렉션 요소의 평균 구하기

List<Integer> list = Arrays.asList(1,2,3,7);

list.stream()
       .mapToInt(Integer::intValue)
       .average()
       .ifPresent(a -> System.out.println("평균: " + a));

 

Optional 바르게 사용하기

https://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/

 

출처

이것이 자바다

자바의신

반응형

댓글