자바 스트림 정리(자바의 정석)

2023. 6. 4. 18:32자바

스트림에 대해 정리를 해보겠습니다.

 

1. 스트림, 스트림의 특징

자바에서는 컬렉션 프레임워크를 활용해서 데이터 소스를 표준화하는 방법을 지원합니다.

하지만 List, Set과 Map의 표준화가 다른거처럼 완전히 표준화가 된 방법은 아니였습니다.

Stream을 통해 다양한 데이터 소스를 표준화 할 수 있게 되었습니다.

 

Stream을 사용하는 방법은 컬렉션, 배열 등에 담긴 데이터소스를 스트림으로 만듭니다.

그리고 난 후 중간연산을 진행한 후 최종연산을 통해 결과를 출력합니다.

 

Stream은 데이터의 연속적인 흐름을 말합니다.

 

스트림을 사용하는 과정은

1. 스트림을 만든다.

2. 중간연산 (0 ~ n번) 가능

3. 최종연산(0 ~ 1번) 가능

최종연산이 진행된 후에는 동일한 스트림을 사용할 수 없다. 따라서 스트림을 다시 만들어서 사용해야 합니다.

 

스트림의 특징에 대해 살펴보도록 하겠습니다.

 

스트림은 원본을 변경하지 않고 데이터 소스로부터 데이터를 읽기만합니다.

스트림은 일회용입니다.

최종 연산 전까지 중간 연산이 수행되지 않습니다. (지연된 연산)

위에 예시를 본다면 로또번호를 출력시 번호가 중복되면 안됩니다. distinct라는 중간연산자를 사용하고 있을 때 중복되지 않도록 연산을 하여 연산이 다 끝난 후 최종 연산 때 결과를 출력합니다.

 

위와 같이 반복문을 안으로 넣어서 소스코드를 간결하게 해줍니다.(속도는 느려진다는 단점이 있습니다.)

 

병렬스트림을 통해 작업을 동시에 진행하여 속도를 빠르게 할 때 사용됩니다.

parallel()을 통해 병렬 스트림으로 전환가능합니다.

 

stream()을 통해 컬렉션 인터페이스를 스트림으로 변환한다.

 

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

public class Ex14_0b {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Stream<Integer> intStream = list.stream();
        intStream.forEach(System.out::println);
    }
}

 

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Ex14_0b {
    public static void main(String[] args) {
//        Stream<String> strStream = Stream.of("a", "b", "c");
//        Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});
//        Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"});
//        Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 3);

//        String[] strArr = {"a", "b", "c"};
//        String[] strArr = new String[]{"a", "b", "c"};
//        Stream<String> strStream = Stream.of(strArr);
        Stream<String> strStream = Stream.of(new String[]{"a", "b", "c"});

//        Stream<String> strStream = Stream.of({"a", "b", "c"});  // 에러

        strStream.forEach(System.out::println);


        int[] intArr = {1,2,3,4,5};
        IntStream intStream = Arrays.stream(intArr);
        intStream.forEach(System.out::println);
        
    }
}

결과

a
b
c
1
2
3
4
5

 

스트림에는 유한 스트림과 무한 스트림이 있습니다.

스트림의 사이즈를 정해주면 유한 스트림이 됩니다.

 

public class Ex14_0b {
    public static void main(String[] args) {
        // IntStream intStream = new Random().ints();  //무한스트림
        IntStream intStream = new Random().ints(10, 5, 10);
        intStream.forEach(System.out::println);
    }
}

5 이상 10 미만인 범위에서 10개의 랜덤 수를 출력합니다.

 

 

public class Ex14_0b {
    public static void main(String[] args) {
        Stream<Integer> intStream = Stream.iterate(0, n -> n + 2);
        intStream.limit(10).forEach(System.out::println);

        Stream<Integer> oneStream = Stream.generate(() -> 1);
        oneStream.limit(10).forEach(System.out::println);
    }
}

 

결과

0
2
4
6
8
10
12
14
16
18
1
1
1
1
1
1
1
1
1
1

 

 

'자바' 카테고리의 다른 글

자바 람다 정리(자바의 정석)  (0) 2023.05.29
어노테이션 정리(자바의 정석)  (0) 2023.05.22
enum 정리(자바의 정석)  (0) 2023.05.21
제네릭 정리 (자바의 정석)  (0) 2023.05.20
컬렉션 - hashMap 정리  (0) 2023.05.17