[Spring Test]-IntStream의rangeClosed

2020년 03월 10일 by Xion

    [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까지는 아무것도 하지 않을 뿐입니다.

 

 

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

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