English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 프로세스 제어

Java 배열

Java 객체 지향(I)

Java 객체 지향(II)

Java 객체 지향(III)

Java 예외 처리

Java 리스트(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 9 개선된 Optional 클래스

Java 9 새로운 기능

Optional 클래스는 Java에서 8 에서 도입된 Optional 클래스는 Java에서 null 참조 예외를 잘 해결합니다... Java 9 에서, 기능을 개선하기 위해 세 가지 메서드를 추가했습니다:

  • stream()

  • ifPresentOrElse()

  • or()

stream() 메서드

문법

public Stream<T> stream()

stream 메서드의 역할은 Optional을 Stream으로 변환하는 것입니다. 그 Optional에 값이 포함되어 있으면 해당 값을 포함한 Stream을 반환하고, 그렇지 않으면 빈 Stream을 반환합니다 (Stream.empty()).

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Tester {
public static void main(String[] args) {
   List<Optional<String>> list = Arrays.asList (
      Optional.empty(), 
      Optional.of("A"), 
      Optional.empty(), 
      Optional.of("B"));
 
      //filter the list based to print non-empty values
  
      //if optional is non-empty, get the value in stream, otherwise return empty
      List<String> filteredList = list.stream()
         .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
         .collect(Collectors.toList());
 
      //Optional::stream 메서드는 하나의 스트림을 반환합니다. 
      //데이터가 존재하면 또는 없으면 0 개의 요소를 추가합니다.
      List<String> filteredListJava9 = list.stream()
         .flatMap(Optional::stream)
         .collect(Collectors.toList());
 
      System.out.println(filteredList);
      System.out.println(filteredListJava9);
   }  
}

실행 출력 결과는:

[A, B]
[A, B]

ifPresentOrElse() 메서드

문법

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

ifPresentOrElse 메서드의 개선은 else를 추가하여 두 개의 매개변수 Consumer와 Runnable을 받음.

ifPresentOrElse 메서드의 용도는, Optional이 값이 포함되어 있으면 그 값을 포함한 함수 action을 호출하며, action.accept(value)와 같습니다. ifPresent와의 차이는, ifPresentOrElse는 두 번째 매개변수 emptyAction도 가지고 있으며, Optional이 값이 포함되어 있지 않으면 emptyAction를 호출합니다. 즉, emptyAction.run().

온라인 예제

import java.util.Optional;
 
public class Tester {
   public static void main(String[] args) {
      Optional<Integer> optional = Optional.of(1);
 
      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));
 
      optional = Optional.empty();
 
      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));
   }  
}

실행 출력 결과는:

Value: 1
Not Present.

or() 메서드

문법

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

값이 존재하면 Optional이 지정한 값을 반환하고, 없으면 예약된 값을 반환합니다.

import java.util.Optional;
import java.util.function.Supplier;
 
public class Tester {
   public static void main(String[] args) {
      Optional<String> optional1 = Optional.of("Sea");
      Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
      optional1 = optional1.or( supplierString);
      optional1.ifPresent( x -> System.out.println("Value: " + x));
      optional1 = Optional.empty();    
      optional1 = optional1.or( supplierString);
      optional1.ifPresent( x -> System.out.println("Value: " + x));  
   }  
}

실행 출력 결과는:

Value: Sea
Value: Not Present

Java 9 새로운 기능