[Spring Test]-IntStream의rangeClosed

[Spring Test]-IntStream의rangeClosed

| IntStream

- Java8에서는 반복분 ex)while,do-while,for 등을 간결하게 처리할 수 있는 방법을 제공합니다.

- 무조건 IntStream이 좋은 것이 아니고, 그때그때 상황에 따라 적절한 반복문을 쓰는 것이 필요합니다.

- 하지만 IntStream을 잘 쓰면 코드가 깔끔해져서 좋습니다.

- Stream은 당연히 IntStream 말고도 여러 종류의 Stream이 있습니다.

자바8에 추가된 java.util.stream 패키지입니다.

먼저 간단한 예시를 보여드리겠습니다.

for문

public void _loop() { for (int i = 1 ; i <= 10 ; i++) { System.out.println(i); } }

IntStream.range

public void intStream_range() { IntStream.range(1, 10).forEach(System.out::println); }

IntStream.range는 1부터 10까지의 integer를 순서대로 뽑아냅니다.

람다 표현식과(system.out::println) forEach 라는 함수로 명령을 내릴 수 있습니다.

다만, 이 표현 방식은 2번째의 파라미터는 범위를 포함하지 않습니다. (즉,1,2,3,4,5,6,7,8,9까지만)

IntStream.rangeClosed()

public void rangeClosed() { IntStream.rangeClosed(1, 10).forEach(System.out::println); }

위와 같은 방법은 2번째 파라미터를 포함시켜 뽑아주는 역할을 합니다.

| range()와의 rangeClosed()의 차이점

-2번째 파라미터를 범위에 포함하느냐 마냐의 차이입니다.

결과적으로 위 for문과 IntStream.Closed()의 경우 같은 결과를 가지게 됩니다.

1 2 3 4 5 6 7 8 9 10

하지만, 반복문 대신 무작정 IntStream을 사용 해서는 안됩니다.

IntStream같은 경우 물줄기와 같은 역할을 하기 때문에 한번 실행하면 break문을 만나도 내부적으로는 어쨌든 실행이 모두 됩니다.

비교하여 보여드리겠습니다.

for문의 break

public void _break() { for (int i = 1 ; i <= 10 ; i++) { if (i == 5) { break; } System.out.println(i); } } //결과 1 2 3 4

IntStream의 경우

public void intStreambreak() { IntStream.rangeClosed(1, 10) .forEach(i -> { if (i == 5) { return; } System.out.println(i); }); } //결과 1 2 3 4 6 7 8 9 10

결과 : 5만 빼고 전부 실행

위와 같이 실행된 이유는 Stream은 물줄기 같은 역할을 한다고 말씀드렸습니다.

때문에 forEach안에 정의된 내용을 수행하는 것 입니다.

return을 하였다고 멈추는 것이 아닌 숫자 5만 걸러지고 나머지는 뽑아내기 때문입니다.

수정된 intStream

public void intStreambreak() { IntStream.rangeClosed(1, 10).forEach(i -> { //수정 if (i >= 5) { return; } System.out.println(i); }); } //결과 1 2 3 4

수정된 코드는 결과 값은 5입니다.

하지만 위 코드는 for문의 break처럼 5에서 반복이 끝나는 것이 아닙니다.

결국 IntStream은 내부적으로는 10까지 실행됩니다. 다만 5~10까지는 아무것도 하지 않을 뿐입니다.

같은 성능을 내기 위한 코드도 물론 작성할 수 있지만 코드량이 길어질뿐더러 복잡해지기 때문에

상황에 맞게 사용하시는 것을 권장 드립니다.

from http://2ham-s.tistory.com/277 by ccl(A) rewrite - 2020-03-11 04:54:38

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[sts] spring boot groovy 적용 실행 하기

2020 LCK 롤챔스 Spring 경기 재개 및 일정