“Stream”이라는 단어의 사전적 의미는 “흐르다”라는 의미를 가지고 있다. Java에서도 비슷한 의미인데 여기에서는 “데이터”의 흐름을 말한다.
그림에서 보는 것처럼 물고기들을 그물로 잡고 일정 기준으로 박스에 담아서 하나로 모은 뒤 트럭으로 실어 보낸다.
데이터.Stream생성().중개연산()…종료연산();
중개 연산
종료 연산
names.stream().skip(3).map((n) -> {
System.out.println(n);
return "success";
});
해당 코드는 skip, map이라는 중개 연산자 혹은 중간 연산자만 존재하므로 어떤 결과도 출력하지 않는다.
List<Integer> names = Arrays.asList(1, 2, 3, 4);
names.stream().skip(3).map((n) -> {
System.out.println(n);
return "success";
}).forEach(System.out::println);
이제 결과가 출력되는데 종료 연산자인 forEach가 붙었기 때문이다.
줄 수를 줄이는 Stream 코드
public class Main {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
int num = it.next();
System.out.println(num);
}
}
}
public class Main {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println);
}
}
→ 외부 반복자란 개발자가 코드를 직접 컬렉션의 요소를 반복해서 가져오는 패턴을 의미한다. 우리가 흔히 사용하는 index나 Iterator를 사용한 while문은 모두 외부 반복자를 사용하는 것이다. 반면에 내부 반복자는 컬렉션 내부에서 요소들을 반복시킨다. 개발자는 요소당 처리해야 할 코드만 제공한다.
→ 내부 반복자는 요소들의 변경 순서를 변경하거나, 멀티 코어 CPU를 최대한 활용하기 위해서 요소들을 분배시켜 병렬 작업을 할 수 있도록 도와준다.