ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 스트림(Stream)의 종류와 생성 방법
    Language/Java 2022. 11. 30. 15:37

    스트림(Stream)의 종류와 생성 방법

    스트림의 종류

    java.util.stream 패키지에는 다양한 스트림 API들이 존재한다. 패키지 내용을 보면 BaseStream 인터페이스를 부모로 해서 자식 인터페이스들이 상속 관계를 이루고 있다.

    BaseStream 인터페이스에는 모든 스트림에서 사용할 수 있는 추상 메서드들이 존재할 뿐 코드에서 직접적으로 사용하지는 않는다.

    코드에서 직접적으로 사용하는 것은 Stream, IntStream, LongStream, DoubleStream이 있다. 그리고 이 중에서 Stream만 객체 요소를 처리한다.

     

    스트림을 생성하는 방법

    1. 컬렉션으로부터 스트림 얻기

    컬렉션으로는 주로 List가 사용되며, 내장된 메서드인 stream()을 사용한다.

     

    Stream<Student> stream = studentList.stream();

    만약, 학생 객체를 저장하는 studentList를 정의하였다면, 위와 같이 스트림을 얻을 수 있다.

    그리고 정의한 stream을 이용하여 여러 가지 중간 처리나 최종 처리 작업을 수행하면 된다. 또한, 여기서 studentList.stream()과 같이 처음 얻어온 스트림을 오리지널 스트림이라고 한다.

     

    2. 배열로부터 스트림 얻기

    Stream<String> stream = Stream.of("a", "b", "c");
    
    IntStream stream = IntStream.of(1, 2, 3);
    
    Stream<String> stream = Arrays.stream(nameArr);

    배열도 컬렉션에서 스트림을 얻어오는 것과 비슷하다.

    첫 번째, 두 번째 줄은 가변 인자를 사용한 것이다. Stream.of() 메서드를 통해 즉석으로 원하는 값을 집어넣음으로써 스트림을 생성할 수 있었다.

    마지막으로, 학생의 이름을 저장하는 nameArr가 있다고 가정해 보겠다. Arrays.stream() 메서드를 통해 nameArr로부터 스트림을 얻어올 수 있다.

     

    3. 숫자 범위로부터 스트림 얻기

    앞서 설명했던 것과 같이 컬렉션이나 배열을 정의하여 스트림을 얻어올 수도 있지만, 단순하게 1부터 100까지의 정수가 담긴 스트림을 얻고 싶을 때는 range() 또는 rangeClosed() 메서드를 사용하면 된다.

    range() 메서드는 [a, b)로 끝 구간이 열린 구간이고, rangeClosed() 메서드는 [a, b]로 끝 구간이 닫힌 구간이라는 차이가 있다.

     

    IntStream stream = IntStream.rangeClosed(1, 100);

    위와 같이 컬렉션이나 배열 없이도 바로 1~100까지의 정수가 담긴 스트림을 얻어올 수 있다.

     

    4. 빈 스트림 얻기

    Stream<String> stream = Stream.empty();

    빈 스트림만 선언해 놓고 싶을 경우에는 위 소스코드와 같이 작성하면 된다.

     

    5. 람다식으로 스트림 생성하기 - iterate()

    iterate() 메서드는 for 문과 비슷한 구조를 갖는데, 매개 변수로 초기값, Predicate<T>, UnaryOperator<T>를 사용한다. 여기서 Predicate<T>는 선택이다.

     

    Stream<Integer> stream = Stream.iterate(0, n -> n + 1).limit(5);   // 0, 1, 2, 3, 4
    
    Stream<Integer> stream = Stream.iterate(0, n -> n < 5, n -> n + 1);     // 0, 1, 2, 3, 4

    그런데, iterate() 메서드를 사용할 때 주의할 점이 있다. 바로 제한 범위를 정해주어야 한다는 것이다. 만약, 제한 범위를 설정하지 않았다면, 무한정 값이 할당된다.

    따라서, limit() 메서드를 사용하거나 Predicate<T>를 이용하여 위 문제를 해결할 수 있다.

     

    6. 람다식으로 스트림 생성하기 - generate()

    generate() 메서드는 매개 변수로 오직 Supplier<T>만을 갖는다. Supplier<T>는 매개 변수를 필요로 하지 않으므로 generate() 메서드는 결국 스트림 생성 시 별도의 인수가 필요하지 않을 때 사용된다.

     

    Random random = new Random();
    IntStream stream = IntStream.generate(() -> random.nextInt(45) + 1).limit(6);

    위 소스코드와 같이 로또 번호를 생성할 때 사용할 수 있다.


    출처

    https://steady-coding.tistory.com/310

     

    728x90

    댓글

Designed by Tistory.