Java

[Java] Stream 생성하는 방법들

수수한 인간 2025. 5. 6. 18:10

들어가면서

오늘은 Stream 생성하는 방법에 대해서 정리하겠습니다.

1. 컬렉션(List, Set등)으로 스트림 생성
2. 배열로 스트림 생성
3. Stream.of, Stream.ofNullable(java 9)로 스트림 생성
4. 무한 스트림(iterate)으로 스트림 생성
5. 무한 스트림(generate)으로 스트림 생성
6. 스트림 빌더로 스트림 생성
7. 빈스트림으로 스트림 생성
8. Stream 연결로 스트림 생성
9. 기본형 특화 스트림(Int, Long, Double)으로 스트림 생성


컬렉션(List, Set등)으로 스트림 생성

List, Set등 Collection을 상속받은 객체에서 사용할 수 있는 방법입니다.

// Collection 인터페이스에 정의됨
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

// 사용법
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,8);
Stream<Integer> stream = numbers.stream(); // 스트림 생성
stream1.forEach(System.out::println); // 스트림 내용 출력 1, 2, 3, 4, 5, 6, 7, 8, 8

배열로 스트림 생성

Arrays 클래스에 정의된 stream으로 상용하여 Stream 객체를 생성할 수 있습니다.
기본형 특화 스트림으로도 생성할 수 있습니다.

Integer [] numbers = {0,1,2,3,4,5};
Stream<Integer> stream = Arrays.stream(numbers); // 스트림 생성
stream.forEach(System.out::println); // 스트림 생성 0, 1, 2, 3, 4, 5

int [] numbers2 = {0,1,2,3,4,5};
IntStream intStream =  Arrays.stream(numbers2); // int스트림 생성
intStream.forEach(System.out::println); // 스트림 출력 0, 1, 2, 3, 4, 5

Stream.of, Stream.ofNullable(java 9)로 스트림 생성

Stream.of로 스트림을 생성시 null 값이 들어가면 NPE 에러를 발생하지만
ofNullable는 null값을 넣으면 빈 스트림으로 생성합니다.

Steam class
public static<T> Stream<T> of(T t) {
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}
public static<T> Stream<T> ofNullable(T t) {
    return t == null ? Stream.empty()
                     : StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}

Stream<Integer> ofStream = Stream.of(1,2,3,4,5); // 스트림 생성
ofStream.forEach(System.out::println);  // 스트림 출력 1, 2, 3, 4, 5
Stream<Integer> nullableStream = Stream.ofNullable(null);  // 스트림 생성
nullableStream.forEach(System.out::println); // 스트림 출력X

무한 스트림(iterate)으로 스트림 생성

무한하게 값을 만들어주는 스트림입니다.

Stream class 메소드 
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) 

Stream<Integer> stream = Stream.iterate(1, n-> n+n); // 스트림 생성
stream.limit(5).forEach(System.out::println); // 스트림 출력 1, 2, 4, 8, 16

무한 스트림(generate)

무한하게 값을 만들어주는 스트림입니다.

Stream class 메소드
public static<T> Stream<T> generate(Supplier<? extends T> s)

Stream<Double> stream = Stream.generate(Math::random);  // 스트림 생성
stream.limit(5).forEach(System.out::println); // 스트림 출력 랜덤한 값

스트림 빌더로 스트림 생성

스트림을 빌더 패턴으로 생성하는 방식입니다.

Stream<Integer> streamBuilder = Stream.<Integer>builder()
                                                .add(1)
                                                .add(2)
                                                .add(3)
                                                .add(4)
                                                .build();
streamBuilder.forEach(System.out::println); // 스트림 출력 1, 2, 3, 4

빈스트림으로 스트림 생성

빈 스트림을 생성하는 방법입니다.
Stream.ofNullable에 null 값을 넣은 것과 동일합니다.

Stream class
public static<T> Stream<T> empty() {
    return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);
}


Stream<Integer> emptyStream = Stream.empty(); // 스트림 생성
emptyStream.forEach(System.out::println);// 스트림 출력 X

Stream 연결로 스트림 생성

Stream 객체 2개을 합쳐서 하나의 객체로 만드는 방법입니다.

Stream<Integer> stream1 = Stream.of(1,2,3); // 스트림 생성
Stream<Integer> Stream2  = Stream.of(4,5); // 스트림 생성
Stream<Integer> stream3 = Stream.concat(stream1,Stream2);  // 스트림 합침
stream3.forEach(System.out::println); // 스트림 출력 1, 2, 3, 4, 5

기본형 특화 스트림(Int, Long, Double)으로 스트림 생성

IntStream, LongStream, DoubleStream을 생성하는 방법입니다.
range 메소드는 마지막 값를 포함하지 않은 스트림을 생성하고 rangeClosed는 마지막 값을 포함하는 스트림을 생성합니다.

IntStream intStream = IntStream.range(1,3);  // 스트림 생성
IntStream intStream2 = IntStream.rangeClosed(1,3);  // 스트림 생성
intStream.forEach(System.out::println); // 스트림 출력 1, 2
intStream2.forEach(System.out::println);// 스트림 출력 1, 2, 3

'Java' 카테고리의 다른 글

PDFBox 실무 적용기 - 좌표계 꼬임 문제와 래퍼 설계  (0) 2025.08.24
java Optional 문법 정리  (0) 2025.03.01