gpt4 book ai didi

java - 跳过 Stream 中的最后 x 个元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:21 24 4
gpt4 key购买 nike

如果我有一个 Stream<T> , 我可以很容易地使用 skip(long)跳过流的前几个元素。但是,在流的末尾跳过给定数量的元素似乎没有等效方法。

最明显的解决方案是使用 limit(originalLength - elementsToRemoveAtEnd) ,但这需要事先知道初始长度,但情况并非总是如此。

有没有办法删除未知长度流的最后几个元素,而不必将其收集到 Collection 中? , 计算元素并再次流式传输?

最佳答案

对于长度可能未知的 Stream,没有通用的免存储解决方案。但是,您不需要收集整个流,您只需要与要跳过的元素数量一样大的存储空间:

static <T> Stream<T> skipLastElements(Stream<T> s, int count) {
if(count<=0) {
if(count==0) return s;
throw new IllegalArgumentException(count+" < 0");
}
ArrayDeque<T> pending=new ArrayDeque<T>(count+1);
Spliterator<T> src=s.spliterator();
return StreamSupport.stream(new Spliterator<T>() {
public boolean tryAdvance(Consumer<? super T> action) {
while(pending.size()<=count && src.tryAdvance(pending::add));
if(pending.size()>count) {
action.accept(pending.remove());
return true;
}
return false;
}
public Spliterator<T> trySplit() {
return null;
}
public long estimateSize() {
return src.estimateSize()-count;
}
public int characteristics() {
return src.characteristics();
}
}, false);
}
public static void main(String[] args) {
skipLastElements(Stream.of("foo", "bar", "baz", "hello", "world"), 2)
.forEach(System.out::println);
}

关于java - 跳过 Stream<T> 中的最后 x 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26403319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com