ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 스트림의 생성
    Java 2022. 1. 31. 00:01
    728x90

    이전 시간에 스트림의 특징과 등장 배경에 대해서 알아보았습니다.

     

    https://junuuu.tistory.com/78?category=968252 

     

    이제 스트림의 생성법을 알아보겠습니다

     

    스트림은 아래와 같은 주기를 가집니다.

    1. 스트림 생성

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

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

     

     

    Collection 인터페이스의 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); //스트림은 최종연산을 1번만 진행할 수 있어서 에러가 발생

    stream() 메서드를 통해 컬렉션을 스트림으로 생성했습니다.

    또한 forEach() 최종 연산을 통해서 스트림의 요소를 출력해 보았습니다.

    최종 연산을 2번 할 경우에는 스트림이 이미 닫혀서 에러가 발생합니다.

     

     

    객체 배열로부터 스트림 생성할 수 있습니다.

    Stream<T> Stream.of(T ... values)
    Stream<T> Stream.of(T[])
    Stream<T> Arrays.stream(T[])
    Stream<T> Arrays.stream(T[] array, int startInclusive, int endeXclusive)
    
    
    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);

    Stream.of()를 활용하여 가변 인자를 넣거나 객체 배열을 통해 스트림을 생성할 수 있습니다.

    Arrays.stream()을 활용하여 객체베 열을 인자로 넣고 시작점과 끝점을 넣어 스트림을 생성할 수 있습니다.

    맨 마지막 코드의 0, 3은 배열의 0번째 index에서 2번째 index까지 스트림 요소로 생성함을 의미합니다.

     

     

    기본형 배열로부터 스트림을 생성할 수 있습니다.

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

    객체 배열로 생성하는 것과 유사하지만 Stream<> 대신에 IntStream을 사용합니다.

    InsStream을 사용하게 되었을때 .average(), .sum(), .count()와 같은 다양한 메서드를 활용할 수 있습니다.

     

     

    난수를 요소로 갖는 스트림을 생성할 수 있습니다.

    IntStream intStream  = new Random().ints();		//무한 스트림
    intStream.limit(5).forEach(System.out::println);	//5개의 요소만 출력한다.
    
    IntStream intStream = new Random().ints(5); //크기가 5인 난수 스트림을 반환

    스트림은 무한 스트림와 유한 스트림이 있습니다.

    무한 스트림은 limit()과 같이 자르는 메서드가 필요합니다.

    만약 limit()을 사용하지 않는다면 난수가 무한하게 발생합니다.

     

     

    특정 범위를 갖는 스트림을 생성할 수 있습니다.

    IntStream intStream = IntStream.range(1, 5); // 1, 2, 3,4
    IntStream intStream = IntStream.rangeClosed(1 ,5); // 1, 2, 3 ,4 5

     

    람다식을 활용하여 스트림을 생성할 수 있습니다.

    static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
    static <T> Stream<T> generate<Supplier<T> s)
    
    Stream<Integer> evenStream = Stream.iterate(0, n -> n +2) ; //0, 2, 4, 6, ....
    Stream<Double> randomStream = Stream.generate(Math::random);
    Stream<Integer> oneStream = Stream.generate(() -> 1) ;

    evenStream은 0부터 시작하여 짝수 값을 무한히 생성합니다.

    0은 시작값(초기값) n -> n +2의 람다식은 2씩 증가함을 의미합니다.

     

     

    randomStream을 랜덤 값 요소를 가지는 스트림 생성합니다.

    oneStream을 결과가 항상 1인 스트림을 생성합니다.

     

    둘 다 무한 스트림이기 때문에 limit()과 같은 자르는 연산이 필요합니다.

     

     

    비어있는 스트림을 생성할 수 있습니다.

    Stream emptyStream = Stream.empty();
    long count = emptyStream.count();

     

     

     

    출처

    자바의 정석 

    https://www.youtube.com/watch?v=AOw4cCVUJC4&t=1014s 

     

    댓글

Designed by Tistory.