JAVA Stream API 복습(1)
0.개요
Spring Webflux에서 사용되는 Reactor의 chaining방식은 자바의 stream api를 근간으로 하고 있다.
그러한, 기본적인 기능만 알고 있었던 stream api를 복습해보고자 한다.
여기서 사용되는 용어는 공식적인 표현이 아닌 부분인 경우도 있으며, 나의 자체적인 해석에 따른 점을 유의
Stream이란?
데이터 소스를 표준화된 방법으로 다루기 위한 시도에서 나온 api
유사한 시도가 legacy java에서도 있었다. Collections framework가 그 예인데, 데이터 표준화에 실패한 패배적 상징이라고 볼 수 있다. 그러한 열등감에서 벗어나기 위한 과감한 시도로 java 8에 도입되었다. 어느정도 표준화에는 성공하였으나, 최적화 등의 문제는 남아 있다고 한다.
1. 스트림의 장점
- 원본유지
- 지연연산 (Lazy Evaluation)
-병렬스트림
- Can be no boxing Type(ex) IntStream)
2. 스트림의 구조
스트림
중간연산 (0~N번)
최종연산 (1번 최종 연산시 stream closed)
3. 스트림 만들기
3-1. 객체배열 생성
Stream<T> Stream.of(T values)
3-2. 기본형 배열 생성
IntStream IntStream.of(int values)
-> IntStream은 sum(),average() 등의 메서드를 추가 제공
-> 객체stream은 count()정도만 가능
ex) 무한스트림 생성하기
Intstream is = new Random().ints(); // 무한스트림
//10개, 5~11까지
Intstream is = new Random().ints(10,5,12);
//distinct나 ilimit 활용할 수도 있음
is.disticnt().limit(10); //무한스트림의 경우 limit으로 걸어주면 lazy로 연산
3-3 iterate,generate
Stream.iterate(0,n->n+2)
Stream.generate(Math::random)
->많이 쓰이는 기능은 아니라 간단 예시만
3-4 파일 스트림
Stream<Path> Files.list(Path dir) // path는 파일 또는 디렉토리
Stream<String> Files.lines(Path path) // 파일의 내용을 라인단위로
3-5 비어있는 스트림생성
STream empty = Stream.empty();
-> 활용방법: spring을 이용하여 개발하다보면, null관리가 굉장히 어렵다. 이럴때 빈값을 언젠가는 반환 해야하는데 이 경우에 null대신 stream 빈배열을 내보내는 방법이 있다. 유사하게 collections framework를 활용하는 방법도 있다.
ex) return new ArrayList<Integer>();
4. Stream 중간연산,최종연산
4-1. sorted()