sungwony

[JAVA8] Stream 본문

language/java

[JAVA8] Stream

일상이상삼상 2018. 6. 27. 01:18

Java 8에는 "stream"이 추가되었다. 이는 Java I/O 인터페이스의 InputStream, OutputStream과는 완전히 다르다. 스트림은 "연속된 정보"를 처리하는데 사용한다. 지금까지 우리가 알고 있는 연속된 정보에는 '배열'과 '컬렉션' 등이 존재한다. 아쉽게도 배열에서는 스트림을 활용할 수 없다. 하지만 배열을 컬렉션으로 변환하여 스트림을 활용할 수 있다.


먼저 스트림의 구조에 대해서 알아보자.


list.stream().filter(x -> x>10).count()

      스트림 생성                중개 연산                      종단 연산


스트림 생성 : 컬렉션의 목록을 스트림 객체로 변환. 여기서 스트림 객체는 java.util.stream패키지의 Stream 인터페이스를 말한다. 이 Stream() 메소드는 당연히 Collection 인터페이스에 선언되어 있다.


중개 연산 : 생성된 스트림 객체를 사용하여 중개 연산 부분에서 처리한다. 하지만, 이 부분에서는 아무런 결과를 리턴하지 못한다. 따라서 중개 연산(intermediate operation)이라고 한다.


종단 연산 : 마지막으로 중개 연산에서 작업된 내용을 바탕으로 결과를 리턴해 준다. 그래서 이 부분을 종단 연산(terminal operation)이라고 한다.


여기서 중개 연산은 반드시 존재해야 하는 것은 아니다. 0개 이상의 중개 연산이 존재가 가능한 optional 한 부분이다.


 연산자

 설명

 filter(pred)

 데이터를 조건으로 거를 때 사용

 map(mapper)

 데이터를 특정 데이터로 변환 

 forEach(block)

 for 루프를 수행하는 것처럼 각각의 항목을 꺼냄

 flatMap(flat-mapper)

 스트림의 데이터를 잘게 쪼개서 새로운 스트림 재공

 sorted(comparator)

 데이터 정렬

 toArray(array-factory)

 배열로 변환

 any / all / noneMatch(pred)

 일치하는 것을 찾음

 findFirst / Any(pred)

 맨 처음이나 순서와 상관없는 것을 찾음

 reduce(binop) / reduce(base,binop)

 결과를 취합

 collect(collector) 원하는 타입으로 데이터를 리턴



대표적으로 쓰이는 메소드들을 통하여 좀 더 자세히 살펴보자.



Stream forEach()


다음과 같이 이름(name), 나이(age), 점수(scoreMath, scoreEnglish)를 갖는 학생에 대한 DTO가 있다.


List로 부터 stream forEach()를 통해 각 StudentDTO의 이름을 출력해보자. 


출력결과

김학생

박학생

윤학생



Stream filter()


List로 부터 stream filter()를 통해 80점 이상의 점수를 받은 합격자들의 이름을 출력해보자.


출력결과

 ------ 영어 합격자 발표(합격기준 80점) ----- 

박학생

 ------ 수학 합격자 발표(합격기준 80점) ----- 

김학생

윤학생


지금까지 Stream에 대해 아주 얕게 알아보았다. 함수형 프로그래밍의 패러다임과 Stream 클래스가 제공하는 다양한 메소들을 통해 심도있는 함수형 프로그래밍이 가능할 것이라고 생각하지만 이를 위해서는 더 많이 공부하고, 실제로 구현을 통해 경험을 쌓아갈 필요가 있다.아래는 참고가 될 만한 링크이다.


"JAVA8-StreamAPI"

"씹고 뜯고 맛보고 즐기는 스트림 API"

"[JAVA] 스트림 API"

'language > java' 카테고리의 다른 글

[JAVA] Parallel Stream  (0) 2021.06.22
[JAVA8] 메소드 참조  (0) 2018.06.28
[JAVA8] java.util.function 패키지  (0) 2018.06.27
[JAVA8] 람다(Lambda) 표현식  (0) 2018.06.26
[JAVA8] 자바8 목차  (0) 2018.06.26