본문 바로가기
자바

자바 8 stream 기본

by 근즈리얼 2021. 7. 23.
728x90

stream

1. 데이터의 저장소 x , 데이터들의 흐름

 

-쉽게 컨베이어 벨트를 생각하면 좋다!! map -> filter -> collection

 

2. Funtional in nature : 스트림이 처리한 데이터는 변하지 않는다.

// stream을 이용해도 원래 names의 값은 변하지 않는다.
public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("son");
        names.add("kane");
        names.add("pogba");
        names.add("mata");
        
        Stream<String> name1 = names.stream().map(String::toUpperCase);
        names.forEach(System.out::println);
}

/*
출력
son
kane
pogba
mata
*/

 

3. 스트림으로 처리하는 데이터는 오직 한번만 처리한다.

4. 데이터의 양이 무제한일 수도 있다. -> Short Circuit메소드를 사용해 제한한다.

5. 중개 오퍼레이션은 lazy하다

- 종료 오퍼레이션이 없다면 중개 오퍼레이션이 실행되지 않는다.

public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("son");
        names.add("kane");
        names.add("pogba");
        names.add("mata");
        
        //map은 중개 오퍼레이션 -> 출력 x -> 종료형 오퍼레이터가 없다면 map을 시작을 안함
        names.stream().map((s)->{
            System.out.println(s);
            return s.toUpperCase();
        });
        System.out.println("==================");
        names.forEach(System.out::println);

        System.out.println("===종료형 오퍼레이션 사용 후===");
        // 종료형 오퍼레이션(Collections)를 사용할 경우 map 실행
        List<String> collect = names.stream().map((s)->{
            System.out.println(s);
            return s.toUpperCase();
        }).collect(Collectors.toList());

        System.out.println("===대문자로 바뀐거 확인===");
        //대문자로 바뀐 것도 확인할 수 있다.
        collect.forEach(System.out::println);
        
}
/*
==================
son
kane
pogba
mata
===종료형 오퍼레이션 사용 후===
son
kane
pogba
mata
===대문자로 바뀐거 확인===
SON
KANE
POGBA
MATA
*/

6. 병렬처리가 가능하다.

- 평소에 사용하는 for문으로 단순한 반복문을 해결했지만 조건문이 늘어날수록 복잡해진다.

또한 for문으로는 병렬처리가 불가능하다.

->이런 부분을 stream의 병렬처리로 쉽게 처리할 수 있다.  - parallelStream를 이용

 public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("son");
        names.add("kane");
        names.add("pogba");
        names.add("mata");
        
        
        // 병럴처리
        List<String> collect1 = names.parallelStream().map((s)->{
            System.out.println(s+" " + Thread.currentThread().getName());
            return s.toUpperCase();
        }).collect(Collectors.toList());

        collect1.forEach(System.out::println);
}

/*
pogba main
mata ForkJoinPool.commonPool-worker-2
son ForkJoinPool.commonPool-worker-2
kane ForkJoinPool.commonPool-worker-1
SON
KANE
POGBA
MATA
*/

=> 멀티스레드를 사용하는것이 매번 좋지않음!! 데이터가 엄청 많을때 아니면 그냥 stream을 사용하는 것이 더 효율적일 수 있습니다!@~@!

 

스트림 파이프라인

1. 0이상의 중개 오퍼레이션과 한 개의 종료 오퍼레이션으로 구성

2. 스트림의 데이터 소스는 터미널 오퍼레이션을 실행할 때만 처리

 

중개 오퍼레이션

- stream을 리턴

- stateless와 stateful로 구분할 수 있음

- filter, map, limit ....

 

종료 오퍼레이션

- stream을 리턴 x

- collect, allMatch, count, forEach.....

 

728x90

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

자바가상머신 (JVM)  (0) 2021.08.13
자바 8 stream API  (0) 2021.07.24
인터페이스 기본 메소드(Default Methods)  (0) 2021.07.16
람다식 매소드 레퍼런스  (0) 2021.07.13
함수형 인터페이스와 람다표현식  (0) 2021.07.13

댓글