ofNullable() 메서드는 Stream 클래스에 포함된 정적(static) 메서드로, 전달된 값이 null이 아니면 해당 요소 하나만 담고 있는 순차 스트림(sequential stream)을 반환하고, null이면 빈 스트림(empty stream)을 반환합니다.
Java 9에서 새롭게 도입된 이 메서드는 스트림 처리 과정에서 발생할 수 있는 NullPointerException을 방지하고, 값이 null인지 매번 확인하는 번거로운 null 검사 코드를 제거해 줍니다. 즉, ofNullable() 메서드의 핵심 목적은 값이 null일 때 예외 없이 안전하게 빈 스트림을 반환받는 것입니다.
문법(Syntax)
static <T> Stream<T> ofNullable(T t)
주요 특징
- 인자로 전달된 값이 null이 아니면: 요소 1개를 가진 스트림 반환
- 인자로 전달된 값이 null이면: 아무 요소도 없는 빈 스트림 반환
- Java 8까지는 삼항 연산자나 조건문으로 null 여부를 직접 판단해야 했지만, Java 9부터 이 메서드 하나로 깔끔하게 해결됩니다.
예제 1 — count()로 동작 확인하기
import java.util.stream.Stream;
public class OfNullableMethodTest1 {
public static void main(String args[]) {
System.out.println("TutorialsPoint");
int count = (int) Stream.ofNullable(5000).count();
System.out.println(count);
System.out.println("Tutorix");
count = (int) Stream.ofNullable(null).count();
System.out.println(count);
}
}실행 결과
TutorialsPoint 1 Tutorix 0
결과 분석
Stream.ofNullable(5000)→ 5000은 null이 아니므로 요소 1개를 가진 스트림이 생성되어 count 결과가 1이 됩니다.Stream.ofNullable(null)→ null이므로 빈 스트림이 생성되어 count 결과가 0이 됩니다.
예제 2 — forEach()와 함께 사용하기
import java.util.stream.Stream;
public class OfNullableMethodTest2 {
public static void main(String args[]) {
String str = null;
Stream.ofNullable(str).forEach(System.out::println); // 콘솔에 아무것도 출력되지 않음
str = "TutorialsPoint";
Stream.ofNullable(str).forEach(System.out::println); // TutorialsPoint 출력됨
}
}실행 결과
TutorialsPoint
결과 분석
str이 null일 때는 빈 스트림이 생성되기 때문에 forEach()가 실행되어도 출력되는 내용이 없습니다. 반면 str에 실제 문자열이 할당된 후에는 해당 값을 가진 스트림이 생성되어 정상적으로 콘솔에 출력됩니다.
ofNullable() 메서드를 사용하면 좋은 경우
- 외부 API나 DB 조회 결과처럼 null이 나올 수 있는 값을 스트림 파이프라인에 연결할 때
if (value != null)같은 반복적인 null 체크 코드를 제거하고 싶을 때- null 가능성이 있는 단일 객체를 컬렉션이나 배열로 감싸지 않고 바로 스트림으로 변환하고 싶을 때
이처럼 Stream.ofNullable()은 null 처리를 스트림 API 안으로 자연스럽게 통합해 주는 유용한 기능으로, Java 9 이상 환경에서 null-safe한 스트림 코드를 작성할 때 적극적으로 활용할 수 있습니다.