약간 벗어난 주제 일지 모르지만 이것이 우리가 가진 List<T>
것입니다.Stream<T>
입니다.
먼저 take
util 메소드 가 필요합니다 . 이 방법은 첫 번째 n
요소를 사용합니다.
static <T> List<T> take(List<T> l, int n) {
if (n <= 0) {
return newArrayList();
} else {
int takeTo = Math.min(Math.max(n, 0), l.size());
return l.subList(0, takeTo);
}
}
그냥 작동합니다 scala.List.take
assertEquals(newArrayList(1, 2, 3), take(newArrayList(1, 2, 3, 4, 5), 3));
assertEquals(newArrayList(1, 2, 3), take(newArrayList(1, 2, 3), 5));
assertEquals(newArrayList(), take(newArrayList(1, 2, 3), -1));
assertEquals(newArrayList(), take(newArrayList(1, 2, 3), 0));
이제는 다음을 takeWhile
기반으로 메소드 를 작성하는 것이 매우 간단합니다 .take
static <T> List<T> takeWhile(List<T> l, Predicate<T> p) {
return l.stream().
filter(p.negate()).findFirst(). // find first element when p is false
map(l::indexOf). // find the index of that element
map(i -> take(l, i)). // take up to the index
orElse(l); // return full list if p is true for all elements
}
다음과 같이 작동합니다.
assertEquals(newArrayList(1, 2, 3), takeWhile(newArrayList(1, 2, 3, 4, 3, 2, 1), i -> i < 4));
이 구현은 목록을 몇 번 부분적으로 반복하지만 추가 O(n^2)
작업을 추가하지는 않습니다 . 그것이 허용되기를 바랍니다.