[ TIL ] Stream Iterator

codesver·2023년 3월 10일
0

TIL

목록 보기
6/8
post-thumbnail

📌 About

Stream은 Java 8부터 제공하는 API이다.

Collection, Array에 저장된 요소들을 참조하며 code를 실행할 수 있다.

그 중에 iterate 함수는 static 함수로 원하는 값을 규칙적으로 생성할 수 있다.

📌 Iterate

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);

📌 Range

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);

Stream Function Note

profile
Hello, Devs!

0개의 댓글