Stream은 Java 8부터 제공하는 API이다.
Collection, Array에 저장된 요소들을 참조하며 code를 실행할 수 있다.
그 중에 iterate 함수는 static 함수로 원하는 값을 규칙적으로 생성할 수 있다.
2개의 매개변수를 가진 iterate 함수는 규칙적인 값을 무한히 생성한다.
IntStream.iterate(0, i -> i + 1)
위의 IntStream은 0, 1, 2, 3... 으로 계속해서 생성이 된다.
마치 아래의 while문처럼 동작한다.
int i = 0;
while(true) {
// work
i++;
}
종료 조건문을 다는 방법은 여러가지가 있다.
종료 개수를 알면 limit을 통해 끊을 수 있다.
IntStream.iterate(0, i -> i + 10).limit(10);
실행 조건을 알면 takeWhile을 통해 끊을 수 있다.
IntStream.iterate(0, i -> i + 10).takeWhile(i -> i < 10);
하지만 사실 iterate 함수 자체에 조건문을 넣을 수 있다.
IntStream.iterate(0, i -> CONDITION, i -> UPDATE)...
Stream의 원소값이 condition을 만족하면 이후의 작업을 실행한다.
다음 원소값은 update을 통해 갱신한다.
Stream과 For문을 비교하면 다음과 같다.
for (int i = 0; i < 100; i += 10) {
WORK
}
IntStream.iterate(0, i -> i < 100, i -> i + 10).forEach(i -> WORK);
Iterate 을 통해 반복문을 깔끔하게 한 문장으로 구현할 수 있다.
하지만 성능에 있어서는 차이가 있기 때문에 상황에 따라 for 문으로 변환해야 할 수도 있다.
또한 만약 UPDATE이 단순히 +1을 하는 것이라면 iterate이 아니라 range가 깔끔하다.
다음의 세 코드는 동일한 역할을 한다.
for (int n = 0; n < N; n++) work(n);
IntStream.iterate(0, n -> n < N, n -> n + 1).forEach(this::work);
IntStream.range(0, N).forEach(this::work);