ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Stream 다시 공부
    Java & 배경지식/기본상식 2021. 5. 2. 15:43
    반응형

    Stream을 사용하면서 깊게 생각하지 않고 간단하게 사용법만 사용하였다. 그러다가 Stream을 깊게 사용하려다가 막히는 내 모습을 보고

    이대로는 안되겠다 싶어 다시한번 복습 겸 공부함

     

     

    코드

     

    Steam 함수의 sorted, filter 등등의 코드는 위의 git 주소로 들어가서 확인

     

    Stream이란?

    한줄로 설명

    다양한 데이터 소스를 표준화된 방법으로 다루기 위한 기능

    /**
     * 아래의 코드를 실행시키게 된다면 <br />
     * stream 안쪽에 있는 값이 들어가 있지 않을 것이다.
     * 그 이유는 스트림을 사용할라면
     * 1. 스트림 만들기
     * 2. 중간연상
     * 3. 최종연산을
     * 위 3가지의 조건을 만족시켜야 하는데 현재 1,2단계만 만족했기 때문이다.
     */
    public void whatIsStream() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Stream<Integer> intStream = list.stream();
        Stream<String> stringStream = Stream.of(new String[]{"a","b","c"});
        Stream<Integer> eventStream = Stream.iterate(0, n -> n + 2).limit(10);
        Stream<Double> randomStream = Stream.generate(Math::random);
        IntStream randomIntStream = new Random().ints(5);
    
        System.out.println("intStream : " + intStream);
        System.out.println("stringStream : " + stringStream);
        System.out.println("eventStream : " + eventStream);
        System.out.println("randomStream : " + randomStream);
        System.out.println("randomIntStream : " + randomIntStream);
    }

    중간연산이란?

    • 연산결과가 스트림인 경우
    • 중간연산은 n개를 가질 수 있다.

    최종 연산이란?

    • 연산결과가 스트림이 아닌경우
    • 최종연산은 단 한번만 가능
      • 스트림의 요소를 소모

    중간연산과 최종연산을 코드로 표현

    특징

    • 스트림은 중간 데이터 소스로부터 읽기만 할 뿐 변경하지 않는다.
    • 스트림은 lterator 처럼 일회용이다.
    • 최종 연산 전까지 중간연상이 수행하지 않는다.
      • 지연된 연상
    public void StreamCharacteristic() {
        // 1. 스트림은 데이터 소스로부터 데이터를 읽기만 할뿐 변경하지 않는다.
        List<Integer> list = Arrays.asList(13, 21, 23, 74, 5,26, 71, 18, 96);
        List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
        System.out.println("list : " + list);
        System.out.println("sortedList : " + sortedList);
    
        // 2. 스트림은 lterator 처럼 일회용이다.
        List<Integer> list2 = Arrays.asList(13, 21, 23, 74, 5,26, 71, 18, 96);
        list2.stream().forEach(System.out::print);
        // 아래 코드는 에러가 발생이 된다.
        // 그 이유는 이미 위에서 forEach를 사용해서 최종연산을 행하였기 때문이다.
        //int count = list2.stream().count();
    
        System.out.println();
        
        // 3. 최정 연상 전까지 중간연산이 수행하지 않는다.
        IntStream intStream = new Random().ints(1,46);
        intStream.distinct().limit(6).sorted()
                .forEach(i -> System.out.println("i : " + i));
    
    }
    

     

     

     

     

     

     

     

     

     

     

    참고

    2020.07.09 - [백기선(인프런 강의)/더 자바, Java 8] - Stream 소개

    www.youtube.com/watch?v=AOw4cCVUJC4

    반응형
Designed by Tistory.