코린이의 소소한 공부노트

스트림 생성하기 본문

Java

스트림 생성하기

무지맘 2023. 2. 1. 00:27

1. 컬렉션으로부터 스트림 생성하기

// Coolection 인터페이스의 메서드
Stream<E> stream()
 
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); // List를 스트림으로 변환
 
// 스트림의 모든 요소 출력
intStream.forEach(System.out::print);; // 12345
intStream.forEach(System.out::print);; // 에러. 이미 스트림이 닫혔다.
                                      // intStream = list.stream(); 을 이용해 다시 만든 후
                                      // forEach()를 사용하면 된다.

2. 배열로부터 스트림 생성하기

// 1) 객체 배열로 스트림 만들기
Stream<String> strStream = Stream.of("a","b","c"); // 가변 인자
Stream<String> strStream = Stream.of(new String[] {"a","b","c"});
    // 배열을 매개변수로 넣을 때 new 연산자를 꼭 넣어줘야 한다.
    Stream<String> strStream = Stream.of({"a","b","c"}); // 에러
    // 두 줄로 나눠서 쓰는 것도 가능하다.
    String[] arr = {"a","b","c"};
    Stream<String> strStream = Stream.of(arr); // OK
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"}, 0, 3);
                                     // 배열의 [0, 3)번째 요소까지를 스트림으로 변환
 
// 2) 기본형 배열로 스트림 만들기
IntStream intStream = IntStream.of(1,2,3); // 가변 인자
IntStream intStream = IntStream.of(new int[] {1,2,3});
IntStream intStream = Arrays.stream(new int[] {1,2,3});
IntStream intStream = Arrays.stream(new int[] {1,2,3}, 0, 3);
                                     // 배열의 [0, 3)번째 요소까지를 스트림으로 변환

3. 특정 범위의 정수를 요소로 갖는 스트림 생성하기

// IntStream, LongStream이 사용 가능한 메서드
IntStream intStream = IntStream.range(1, 5); // 1,2,3,4
IntStream intStream = IntStream.rangeClosed(1, 5); // 1,2,3,4,5

4. 난수를 요소로 갖는 스트림 생성하기

IntStream intStream = new Random().ints(); // 무한 스트림 생성
intStream.limit(5).forEach(System.out::println); // 5개의 요소만 출력한다.
                                             // limit()이 없다면 난수를 무한으로 출력한다.
 
IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림을 반환
 
// Random클래스의 메서드들이 생성하는 난수의 범위
Integer.MIN_VALUE <= ints() <= Integer.MAX_VALUE
   Long.MIN_VALUE <= longs() <= Long.MAX_VALUE
              0.0 <= doubles() < 1.0

// 지정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메서드. end는 포함되지 않는다.
// 무한 스트림
IntStream ints(int begin, int end)
LongStream longs(long begin, long end)
DoubleStream doubles(double begin, double end)
// 유한 스트림 
IntStream ints(long streamSize, int begin, int end)
LongStream longs(long streamSize, long begin, long end)
DoubleStream doubles(long streamSize, double begin, double end)

5. 람다식을 소스로 하는 스트림 생성하기

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f) // 이전 요소에 종속적. 무한 스트림
static <T> Stream<T> generate(Supplier<T> s) // 이전 요소에 독립적. 무한 스트림
 
// iterate()는 이전 요소를 seed로 해서 다음 요소를 람다식으로 계산한다.
Stream<Integer> evenStream = Stream.iterate(0, n->n+2); // 0,2,4,6,...
 
// generate()는 seed를 사용하지 않는다.
Stream<Double> randomStream = Stream.generate(Math::random); // 메서드 참조
Stream<Integer> oneStream = Stream.generate(()->1); // 계속 1이 나오는 스트림

6. 파일을 소스로 하는 스트림 생성하기

Stream<Path> Files.list(Path dir) // Path는 파일 또는 디렉토리
Stream<String> Files.lines(Path path) // 파일 내용을 라인 단위로 읽어서 String으로 바꿈
Stream<String> Files.lines(Path path, Charset cs)
Stream<String> lines() // BufferedReader클래스의 메서드

7. 비어있는 스트림 생성하기

Stream emptyStream = Stream.empty(); // 빈 스트림 생성
long count = emptyStream.count(); // 0. 빈 스트림이기 때문에 당연한 결과

'Java' 카테고리의 다른 글

Optional 클래스  (0) 2023.02.07
스트림의 중간 연산  (0) 2023.02.07
스트림의 정의와 특징  (0) 2023.01.30
람다식과 메서드 참조  (0) 2023.01.13
function 패키지와 메서드  (0) 2023.01.12