- [Spring Test]-IntStream의rangeClosed 목차
| IntStream
- Java8에서는 반복분 ex)while,do-while,for 등을 간결하게 처리할 수 있는 방법을 제공합니다.
- 무조건 IntStream이 좋은 것이 아니고, 그때그때 상황에 따라 적절한 반복문을 쓰는 것이 필요합니다.
- 하지만 IntStream을 잘 쓰면 코드가 깔끔해져서 좋습니다.
- Stream은 당연히 IntStream 말고도 여러 종류의 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까지는 아무것도 하지 않을 뿐입니다.
같은 성능을 내기 위한 코드도 물론 작성할 수 있지만 코드량이 길어질뿐더러 복잡해지기 때문에
상황에 맞게 사용하시는 것을 권장 드립니다.
'Spring' 카테고리의 다른 글
[Spring]ResponseEntity (0) | 2020.03.11 |
---|---|
[Spring]@Autowired와 @AllArgsConstructor의 차이 (0) | 2020.03.11 |
[Spring]- UriComponentsBuilder란? (0) | 2020.03.09 |
[Spring]addAttribute와 addFlashAttribute 차이점 (0) | 2020.03.08 |
[Spring]@Transactional이란? (1) | 2020.02.10 |