Web/JAVA

[Java Stream] skip() vs limit()

태애니 2023. 4. 23. 18:21
728x90

 

 

 

 

 

skip() 과 limit() 의 차이

 

 

 

skip() method

skip(n)

stream 의 n번째 요소를 버리는 중간 작업

n은 음수일 수 없으며, stream 보다 크기가 클 경우 빈 스트림을 리턴시킴

 

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    .filter(i -> i % 2 == 0)
    .skip(2)
    .forEach(i -> System.out.print(i + " "));

6 8 10 이 나옴

 

 

filter 에서 2, 4, 6, 8, 10 이 나옴

여기서 skip 2 << 두개 뺌

 

skip() 연산은 매 순간 보이는 요소의 상태를 유지한다

그래서 skip() 을 stateful operation 상태저장작업 이라고 한다

 

 

 

 

 

limit() method

 

limit(n) 은 요청된 n보다 길지 않은 stream을 리턴시켜주는 중간 작업이다

n 매개변수는 음수일 수 없다

 

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    .filter(i -> i % 2 == 0)
    .limit(2)
    .forEach(i -> System.out.print(i + " "));

2,4,6,8,10 중에 

limit(2) -> 2개만 가져옴

 

2,4

 

 

limit() 또한 위와 마찬가지로 stateful operation 상태저장작업 이라고 한다

 

전체 stream을 소비하는 skip() 과 달리 limit은 최대 항목 수에 도달하면 바로 결과 스트림을 반환시켜준다

그래서 limit()는 short-circuiting operation라고도 한다

 

 

infinite streams, limit() can be very useful for truncating a stream into a finite one

무한스트림 작업 시에 이를 finite할 수 있다

 

Stream.iterate(0, i -> i + 1)
    .filter(i -> i % 2 == 0)
    .limit(10)
    .forEach(System.out::println);

숫자의 무한 스트림을 10개의 짝수만 있는 스트림으로 잘라준다.

 

 

 

 

Combining skip() and limit()

private static List<Integer> getEvenNumbers(int offset, int limit) {
    return Stream.iterate(0, i -> i + 1)
        .filter(i -> i % 2 == 0)
        .skip(offset)
        .limit(limit)
        .collect(Collectors.toList());
}

 

728x90