컬렉션의 요소를 하나씩 참조해 람다식으로 처리할 수 있는 반복자
자료구조가 포함하느 모든 값을 메서드에 포함하는 컬렉션과 다르게, 스트림은 요청할 때만 요소를 계산하는 고정된 자료구조를 가집니다.
- 스트림은 여러 개의 조건이 중첩된 상황에서 값이 결정나면 불필요한 연산을 진행하지 않고 조건문을 빠져나와 실행 속도를 높입니다.
이러한 것을,
이를 파이프라이닝이라고 합니다.
스트림에는
1. STREAM : 스트림의 생성
2. FILTER & MAP : 중간 연산자
3. COLLECT : 최종 연산자
가 존재합니다.
animal = ["cat","dog"]
리스트에 스트림을 적용하여 cat과 dog의 철자 하나하나를 분리해서 새로운 리스트로 만드는 작업진행
map을 사용해서 철자들을 분리해보겠습니다.
List<String[]> results = animals.stream().map(animal -> animal.split(""))
.collect(Collectors.toList());
분명 split 메서드를 이용하여 철자를 모두 분리했는데 반환값 타입을 보면 List<String[]>이 나온것을 알 수 있습니다.
[ [ "c", "a", "t" ] , [ "d", "o", "g" ] ]
animal 리스트 내부에서 각각의 요소별로 리스트를 중복으로 만듬.
그렇다면, 하나의 스트림에 철자 하나하나가 다 들어가게 하려면?
List<String> results = animals.stream().map(animal -> animal.split(""))
.flatMap(Arrays::stream)
.collect(Collectors.toList());
String 리스트를 감싸고 있는 더 큰 스트림의 구성요소로 만들어 줄 수 있다.
results = [c, a, t, d, o, g]
flatMap을 사용하면 중복 구조로 되어있는 리스트를 하나의 스트림처럼 다룰 수 있습니다.