[JAVA8] Stream API

이재훈·2023년 5월 7일
0

JAVA8

목록 보기
5/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다.
JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"

Stream

  • 데이터를 담고 있는 저장소(컬렉션)이 아니다.
  • Functional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다.
List<String> upperCaseNames = 
names.stream().map(name -> name.toUpperCase()).collect(Collectors.toList()); 
// names 에 영향을 주지 않는다.
  • 스트림으로 처리하는 데이터는 오직 한번만 처리한다.
  • 무제한일 수 있다. (Short circuit) 메소드를 사용해서 제한할 수 있다.
  • 중개 오퍼레이션은 근본적으로 lazy하다.
names.stream().map(name -> { 
	String upperCaseName = name.toUpperCase();
	System.out.println(upperCaseName);
	return upperCaseName;
});
// map은 중개 오퍼레이션이기 때문에 upperCaseName은 출력되지 않는다.
// 종료 오퍼레이션이 있어야 출력이 된다.
  • 손쉽게 병렬 처리할 수 있다. (병렬처리라고 무조건 빠른 것은 절대 아니다.)
names.parallelStream().map(name -> { 
	String upperCaseName = name.toUpperCase();
	System.out.println(upperCaseName);
	System.out.println(Thread.currentThread().getName());
	return upperCaseName;
}).collect(Collectors.toList());
// 출력 결과
main
WHITE
ForkJoinPool.commonPool-worker-2
JAY
ForkJoinPool.commonPool-worker-11
KEESUN
ForkJoinPool.commonPool-worker-9

스트림 파이프라인

  • 0 또는 다수의 중개 오퍼레이션과 한개의 종료 오퍼레이션으로 구성한다.
  • 스트림의 데이터 소스는 오직 터미널 오퍼레이션을 실행할 때만 처리한다.

중개 오퍼레이션

  • Steam을 리턴한다.
  • Stateless / Stateful 오퍼레이션으로 더 상세하게 구분할 수 있다. (대부분은 Stateless지만 distinct나 sorted 처럼 이전 소스 데이터를 참조해야 하는 오퍼레이션은 Stateful 오퍼레이션이다.)
  • filter, map, limit, skip, sorted, ...

종료 오퍼레이션

  • Stream을 리턴하지 않는다.
  • collect, allMatch, count, forEach, min, max, ...
profile
부족함을 인정하고 노력하자

0개의 댓글