다음 코드는 n
가 어디 n
요소를 버퍼 ArrayDeque
를 사용하지만, 전체 스트림을 수집 할 필요가 없습니다 요소의 수는 건너 뛰려면, 당신은 단지 대규모로 저장이 필요 끝에 건너 뛸 요소 수. 트릭은 skip(n)
을 사용하는 것입니다. 이로 인해 첫 번째 n
요소가 ArrayDeque
에 추가됩니다. 그런 다음, n
요소가 버퍼링되면 스트림은 요소 처리를 계속하지만 ArrayDeque
의 요소를 팝합니다. 스트림의 끝 부분에 도달하면 n
요소가 ArrayDeque
에 붙어 버려지고 버려집니다.
ArrayDeque
은 null
요소를 허용하지 않습니다. 아래 코드는 ArrayDeque
에 추가하기 전에 null
을 NULL_VALUE
에 매핑 한 다음 ArrayDeque
에서 터지게 한 후 NULL_VALUE
을 null
으로 다시 매핑합니다.
private static final Object NULL_VALUE = new Object();
public static <T> Stream<T> skipLast(Stream<T> input, int n)
{
ArrayDeque<T> queue;
if (n <= 0)
return(input);
queue = new ArrayDeque<>(n + 1);
input = input.
map(item -> item != null ? item : NULL_VALUE).
peek(queue::add).
skip(n).
map(item -> queue.pop()).
map(item -> item != NULL_VALUE ? item : null);
return(input);
}
그러한 방법이없는 이유는 아마 당신이주는 것입니다. 일반적으로 스트리밍 중 '스트림'이 종료되는시기를 알 수있는 방법이 없으므로 완료 될 때까지 마지막 몇 가지 요소를 실제로 제거 할 수 없습니다. – Keppil
나머지 요소를 건너 뛰고 싶은 시점을 어떻게 결정합니까? 원래 스트림을 감싸는 자체 스트림을 구현할 수 없습니까? – user
스트림의 길이를 모르는 경우 요소가 마지막임을 어떻게 알 수 있습니까? – assylias