안녕하세요. 오늘은 스트림에 대해서 정리해보겠습니다.
■ 스트림(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 |