gpt4 book ai didi

java - 收集后继续java流

转载 作者:行者123 更新时间:2023-12-02 02:37:19 27 4
gpt4 key购买 nike

我有一个列表,我想使用流进行过滤,抓取前 10 个,然后显示给用户。按下按钮后..我想从该位置继续流式传输。

List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.limit(10)
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);

// some stuff..
onClick(() -> {
List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.skip(10) // will eventually be 10 * amount of times clicked.
.limit(10)
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
});

但问题是,这里我必须对前 10 个以上运行过滤器,但有多少个与过滤器不匹配(再次)。

到目前为止,我的一些解决方案是使用 peek 来存储最后一项的索引,并执行(预跳过)。

List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.limit(10)
.peek(o -> this.storeIndex(o, allResults)) // This feels klunky
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);

onClick(() -> {
List<MyObject> allResults = getResults();
allResults.stream()
.skip(this.storedIndexToSkip) // This being stored from storeIndex function above.
.filter(this::someCrazyFiltering)
.limit(10)
.peek(o -> this.storeIndex(o, allResults)) // Store again for next click; This STILL feels klunky
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
});

我知道流中没有“索引”这样的东西,所以我需要在 storeIndex 函数中执行 allResults.indexOf(o) , (然后将是不同的项目)

但是是否有人能为此想出更好的机制呢?就像能够在过滤器/限制之后分离流??

或者只是忽略所有流,然后返回到旧的 for-each 循环并在找到 10 后存储 i

欢迎任何建议。

最佳答案

您可以将流转换为迭代器并调用 next() 10 次。迭代器将在每次 next() 调用时进行惰性评估。

List<MyObject> allResults = getResults();
Iterator<DisplayItem> it = allResults.stream()
.filter(this::someCrazyFiltering)
.map(this::turnToDisplayItem)
.iterator();

onClick(() -> {
int n = 0;
while(n < 10 && it.hasNext()){
this.addDisplayItemToContainer(it.next());
}
});

关于java - 收集后继续java流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46098418/

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