Language/Java

15-1. 스트림 만들기

리져니 2021. 8. 4. 22:42

스트림의 소스가 될 수 있는 대상은 배열, 컬렉션, 임의의 수 등 다양하다.

 

컬렉션

Collection의 자손인 List와 Set을 구현한 컬렉션 클래스들은 모두 이 메서드로 스트림을 생성할 수 있다.

stream()은 해당 컬렉션을 소스로 하는 스트림을 반환한다.

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) throws IOException {
        List<Integer> list = Arrays.asList(1,2,3,4,5);  // 가변인자
        Stream<Integer> intStream = list.stream();  // list를 소스로 하는 컬렉션 생성

        intStream.forEach(System.out::println); // 스트림의 모든 요소 출력
    }
}

실행결과

 

배열

배열을 소스로 하는 스트림을 생성하는 메서드

 

int, long, double과 같은 기본형 배열을 소스로 하는 스트림 생성 메서드도 있다.

* IntStream에 DoubleStream, LongStream을 넣어주면 각각의 기본형 배열을 소스로 하는 스트림 생성 메서드가 된다.

 

스트림 생성 예제

import java.io.IOException;
import java.util.Arrays;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) throws IOException {
        Stream<String> strStream1 = Stream.of("a", "b", "v");
        Stream<String> strStream2 = Stream.of(new String[]{"a", "b", "v"});
        Stream<String> strStream3 = Arrays.stream(new String[]{"a", "b", "v"});
        Stream<String> strStream4 = Arrays.stream(new String[]{"a", "b", "v"}, 0, 3);

        strStream1.forEach(System.out::print);
        System.out.println();
        strStream2.forEach(System.out::print);
        System.out.println();
        strStream3.forEach(System.out::print);
        System.out.println();
        strStream4.forEach(System.out::print);

        
        IntStream intStream1 = IntStream.of(1,2,3,4);
        IntStream intStream2 = IntStream.of(new int[] {1,2,3,4});
        IntStream intStream3 = Arrays.stream(new int[]{1,2,3,4});
        IntStream intStream4 = Arrays.stream(new int[]{1,2,3,4}, 0, 3);

        intStream1.forEach(System.out::print);
        System.out.println();
        intStream2.forEach(System.out::print);
        System.out.println();
        intStream3.forEach(System.out::print);
        System.out.println();
        intStream4.forEach(System.out::print);


        DoubleStream doubleStream1 = DoubleStream.of(0.1,0.2,0.3);
        DoubleStream doubleStream2 = DoubleStream.of(new double[] {0.1,0.2,0.3});
        DoubleStream doubleStream3 = Arrays.stream(new double[]{0.1,0.2,0.3});
        DoubleStream doubleStream4 = Arrays.stream(new double[]{0.1,0.2,0.3}, 0, 3);

        doubleStream1.forEach(System.out::print);
        System.out.println();
        doubleStream2.forEach(System.out::print);
        System.out.println();
        doubleStream3.forEach(System.out::print);
        System.out.println();
        doubleStream4.forEach(System.out::print);
    }
}

실행 결과

 

특정 범위의 정수

IntStream과 LongStream은 다음과 같이 지정된 범위의 연속된 정수를 스트림으로 생성해서 반환하는 range()와 rangeClosed()를 가지고 있다.

rage()의 경우, 경계 끝인 end가 범위에 포함되지 않는다.

* int보다 큰 범위의 스트림ㅇ르 생성하려면 LonStream에 있는 동일한 이름의 메서드를 사용하면 된다.

 

 

임의의 수

난수를 생성하는데 사용하는 Random클래스에는 인스턴스 아래와 같은 메서드가 있다. 메서드들은 해당 타입의 난수들로 이루어진 스트림을 반환한다.

* 매개변수로 스트림의 크기를 지정해서 유한 스트림을 생성하여 반환한다

  유한 스트림생성 메서드(범위x) 유한 스트림생성 메서드(범위O)
IntStream ints(long streamSize) ints(int begin, int end)
LongStream longs(long streamSize) longs(long begin, long end)
DoubleStream doubles(long streamSize) doubles(double begin, double end)
import java.io.IOException;
import java.util.stream.IntStream;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림 반환
        intStream.forEach(System.out::println);
    }
}

실행 결과

 

파일

list()는 지정된 디렉토리(dir)에 있는 파일의 목록을 소스로 하는 스트림을 생성해서 반환한다.

 

 

빈스트림

요소가 하나도 없는 비어있는 스트림을 생성할 수도 있다.

스트림에 연산을 수행한 결과가 하나도 없을때, null보다 빈스트림을 반환하는 것이 낫다.

Stream emptyStream = Stream.empty();	// empty()는 빈 스트림을 생성해서 반환
long count = emptyStream.count();	// count = 0 이 된다

 

두 스트림의 연결

Stream의 static 메서드인 concat()을 사용하면 두 스트림을 하나로 연결할 수 있다.

* 연결하려는 두 스트림의 요소는 같은 타입이어야함.

String[] str1 = {"123", "456", "789"};
String[] str2 = {"ABC", "abc", "DEF"};

Stream<String> strs1 = Stream.of(str1);
Stream<String> strs2 = Stream.of(str2);
Stream<String> str3 = Stream.concat(strs1, strs2);
728x90

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

15-3. Optional  (0) 2021.08.05
15-2. 스트림의 중간 연산  (0) 2021.08.05
15. 스트림(stream)  (0) 2021.08.04
14. java.util.function 패키지  (0) 2021.08.04
13. 람다(Lambda)  (0) 2021.08.04