elevne's Study Note

Java - Optional 본문

Backend/Java

Java - Optional

elevne 2023. 5. 23. 21:01

Stream 을 사용할 때 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스를 사용할 수 있다. 이들은 저장하는 값의 타입만 다를 뿐 제공하는 기능은 거의 동일하다. 

 

 

 

Method Description
isPresent() 값이 저장되어 있는지 여부
orElse() 값이 저장되어 있지 않을 경우 디폴트 값 지정
ifPresent() 값이 저장되어 있을 경우 Consumer 에서 처리

 

 

 

컬렉션의 요소는 동적으로 추가되는 경우가 많은데, 가령 컬렉션의 여러 요소들을 통해 하나의 집계값을 산출하려 할 때  컬렉션의 요소가 추가되지 않아 저장된 요소가 없을 경우 NoSuchElementException 예외가 발생할 수 있다. 이럴 때 Optional 클래스들을 사용할 수 있다. 

 

 

 

첫 번째로, Optional 객체를 얻어 isPresent() 메소드로 값의 존재 여부를 확인해볼 수 있다.

 

 

 

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(new Integer[]{1, 2, 3});
    OptionalDouble optional = list.stream().mapToInt(Integer::intValue)
            .average();
    if (optional.isPresent()){
        System.out.println(optional.getAsDouble());
    }
}

 

 

result

 

 

 

두 번째로는 orElse() 메소드로 디폴트 값을 지정해놓는 방법이 있다. 

 

 

 

public static void main(String[] args) {
    List<String> list = Arrays.asList(new String[]{"1", "2", "4"});
    double avg = list.stream().mapToInt(Integer::parseInt).filter(a -> a > 5)
            .average().orElse(0.0);
    System.out.println(avg);
}

 

 

result

 

 

 

세 번째로, ifPresent() 메소드로 평균값이 있을 경우에만 값을 이용하는 람다식을 실행하게끔 할 수 있다.

 

 

 

public static void main(String[] args) {
    List<String> list = Arrays.asList(new String[]{"1", "2", "4"});
    list.stream().mapToInt(Integer::parseInt)
            .average().ifPresent(a -> System.out.println("Average: " + a));
}

 

 

result

 

 

 

 

 

 

Reference:

이것이 자바다

'Backend > Java' 카테고리의 다른 글

Java - Socket(TCP)  (0) 2023.05.25
Java - Network, IP  (0) 2023.05.24
Java - 보조 스트림  (0) 2023.05.21
Java - IO 입출력  (0) 2023.05.20
Java - Stream  (0) 2023.05.19