Java

[Java-11] 스트림 (Stream)

zamezzz 2017. 3. 2. 00:03

안녕하세요. 오늘은 스트림에 대해서 정리해보겠습니다.


스트림(Stream)


먼저 스트림이란 ?

컬렉션의 저장 요소를 하나씩 참조하여 람다식으로 처리할 수 있도록 해주는 반복자


크게 중간 처리와 최종 처리로 나뉘어 집니다.

중간 처리 : 필터링, 매핑, 정렬, 그룹핑 등

최종 처리 : 합계, 평균, 카운팅 등


● 특징

  - 람다식으로 요소 처리 코드를 제공

  - 내부 반복자를 사용한 병렬처리

  - 중간 처리와 최종처리를 할 수 있다.


여기서 람다식은 무엇일까요? 람다식 역시 자바8에서 등장한 개념입니다.


다음 포스팅(또는 그 다음 포스팅...)에서 정리할 예정입니다.


여기서는 간단히 정의만 알고 넘어가죠! 람다식의 정의는 아래와 같습니다.

식별자 없이 실행 가능한 익명의 함수 표현식


이제 람다식은 중간중간 계속 나올텐데요. 아 이런 느낌으로 사용되는구나 정도로 이해하면


될 것 같습니다. 이후에 자세히 정리하겠습니다.


● 스트림 얻기


먼저 스트림을 사용하기 위해서는 스트림을 얻어야 하는데요.


아래에서 그 방법을 정리해보겠습니다. 크게 총 5가지 방법으로 나뉠 수 있습니다.


- 컬렉션으로부터 스트림 얻기

stream = studentList.stream();

- 배열로부터 스트림 얻기

stream = Arrays.stream(strArray);

- 숫자 범위로부터 스트림 얻기

stream = IntStream.rangeClosed(1, 100);

- 파일로부터 스트림 얻기

Path path = Paths.get(“*/*.txt”);

stream = Files.lines(path, Charset.defaultCharset());

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

-디렉토리로부터 스트림 얻기

stream = Files.list(path)

stream.forEach( p -> System.out.println(p.getFileName()))


이제 스트림을 얻는 방법을 바탕으로 실제 어떻게 스트림을 사용하는지 알아보죠.


직접 예제와 함께 다루어 보겠습니다.


● 스트림 사용하기 - 중간처리 및 최종처리


먼저 중간처리 및 최종처리의 종류에 대해 알아보겠습니다.


* 중간처리


중간처리는 크게 필터링, 매핑, 정렬, 루핑으로 나뉘어 지는데요.


중간처리는 말 그대로 중간에 처리하는 부분입니다. 이후 최종 처리가 진행되어야 해요


- 필터링

distinct()

filter()

- 매핑

flatMapXXX()

mapXXX()

mapToInt

mapToDouble

asDoubleStream()

boxed()

int, long, double 요소를 Integer, Long, Double 요소로 박싱

wrapper 클래스로 변환 

- 정렬

sorted()

객체 요소일 경우에는 클래스가 Comparable을 구현해야 함

- 루핑

peek() : 반복

이후 반드시 최종처리 메소드가 호출되어야 함!


* 최종처리


최종 처리는 루핑, 매칭, 기본 집계로 이루어집니다.


말 그대로 최종처리입니다. 단독으로 사용이 가능합니다.


- 루핑

forEach() 반복. peek()와 같은 역할이지만 최종처리임이 차이가 있음

- 매칭

allMatch : 모두 만족

anyMatch : 하나라도 만족

nonMatch : 모두 만족하지 않음

위 3가지 매칭 모두 boolean타입입니다.

- 기본 집계

sum

count

average

max

min

위의 5가지 기본 집계는 가장 직관적으로 이해가 되실겁니다.


말 그대로 해당 sum, count, average, max, min의 역할을 합니다.


기본 적인 정의는 위에서 모두 알아보았는데요.


이해가 한 번에 가는 것도 있고 없는 것도 있을 거에요 아마.


이럴 때 중요한 것은 직접 코딩하여 테스트하는것인데요.


함께 몇가지에 대해서 예제를 작성해봅시다.


● 예제1. 배열로부터 스트림 얻어와 반복하여 출력하기


첫 번째 예제는 다음과 같습니다.


배열로부터 스트림을 얻고, forEach() 최종처리하여 반복 출력하는 예제입니다.


코드와 결과는 아래 스크린샷을 참고해주세요.


● 예제2. 배열로부터 스트림 얻어와 중복제거 후 출력하기


두 번째 예제는 다음과 같습니다.


배열로부터 스트림을 얻고, 중복을 제거하여 문자를 출력해보겠습니다.


그냥 출력한다면... ' 가 나 다 라 마 가 나 다 사 ' 이렇게 출력이 되었겠죠?


중복 제거 후 결과는 어떻게 달라졌을까요?


코드와 결과는 아래 스크린샷을 참고해주세요.



● 예제3. peek 사용 및 sum 사용


한 가지 예제만 더 해보겠습니다.


마찬가지로 배열로 int형 스트림을 얻었고 이번에는 중간처리인 peek를 사용하겠습니다.


위에서 정리한 것 처럼 중간처리인 peek는 반드시 최종처리를 해주어야 해요.


그래서 sum을 써보고 같이 출력되도록해보겠습니다.


코드와 결과는 아래 스크린샷을 참고해주세요.



예제와 함께 스트림에 대해서 정리하였습니다.


직접 해보면 이해가 좀 더 쉽게 되는 것 같네요. 직접 해보시길 추천드려요


오늘도 긴글 읽어주셔서 감사합니다.

반응형

'Java' 카테고리의 다른 글

[Java-13] 제네릭  (0) 2017.03.18
[Java-12] 람다식 (Lambda)  (0) 2017.03.11
[Java-10] 예외 처리(Exception)  (0) 2017.02.18
[Java-9] 추상클래스, 추상메소드, 인터페이스  (0) 2017.02.12
[Java-8] 상속  (0) 2017.02.05