收集后继续java流

收集后继续java流,java,java-stream,Java,Java Stream,我有一个列表,我想使用流过滤,抓取前10个,并显示给用户。 按下按钮后。。我想从那个位置继续流 List<MyObject> allResults = getResults(); allResults.stream() .filter(this::someCrazyFiltering) .limit(10) .map(this::turnToDisplayItem) .forEach(this::addDisplayItemToContainer);

我有一个列表,我想使用流过滤,抓取前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);
});
List allResults=getResults();
allResults.stream()
.filter(此::someCrazyFiltering)
.限额(10)
.map(此::turnToDisplayItem)
.forEach(此::addDisplayItemToContainer);
//一些东西。。
onClick(()->{
List allResults=getResults();
allResults.stream()
.filter(此::someCrazyFiltering)
.skip(10)//最终将被单击10*次。
.限额(10)
.map(此::turnToDisplayItem)
.forEach(此::addDisplayItemToContainer);
});
但问题是,在这里,我必须在前10+上运行过滤器,有多少与过滤器不匹配(再次)

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

List allResults=getResults();
allResults.stream()
.filter(此::someCrazyFiltering)
.限额(10)
.peek(o->this.storeIndex(o,allResults))//这感觉很糟糕
.map(此::turnToDisplayItem)
.forEach(此::addDisplayItemToContainer);
onClick(()->{
List allResults=getResults();
allResults.stream()
.skip(this.storedIndexToSkip)//这是从上面的storeIndex函数存储的。
.filter(此::someCrazyFiltering)
.限额(10)
.peek(o->this.storeIndex(o,allResults))//再次存储以供下次单击;这仍然让人感觉不舒服
.map(此::turnToDisplayItem)
.forEach(此::addDisplayItemToContainer);
});
我知道流中没有“索引”这样的东西,所以我需要在
storeIndex
函数中执行
allResults.indexOf(o)
(然后将是不同的项)

但如果有人能想出一个更好的机制?就像在
过滤器
/
限制
之后能够分离出流一样

或者干脆忽略所有的流,在找到10个循环后,就返回到原来的循环并存储
i


欢迎任何建议。

您可以将流转换为迭代器并调用next()10次。迭代器将在每次下一次()调用时进行计算

List allResults=getResults();
迭代器it=allResults.stream()
.filter(此::someCrazyFiltering)
.map(此::turnToDisplayItem)
.iterator();
onClick(()->{
int n=0;
而(n<10&&it.hasNext()){
this.addDisplayItemToContainer(it.next());
}
});

您可以将流转换为迭代器并调用next()10次。迭代器将在每次下一次()调用时进行计算

List allResults=getResults();
迭代器it=allResults.stream()
.filter(此::someCrazyFiltering)
.map(此::turnToDisplayItem)
.iterator();
onClick(()->{
int n=0;
而(n<10&&it.hasNext()){
this.addDisplayItemToContainer(it.next());
}
});

从哪里获取数据?使用
for
循环没有什么错。这比到处强制使用流api要好得多。这并不重要,这就是为什么我只是将其psudocoded为
getResults()
。另一个想法是,只要有一个迭代器,我就会一直尝试从中获取内容,直到10个内容匹配为止,或者我已经完成了。。但是我不知道迭代器保持“活动”一段时间是否会有问题?这很重要。如果您处理的是10000行数据库数据,而不是100行内存中的数据,那么您应该做的事情会有很大的不同。
getResults()
从哪里获取数据?使用
for
循环没有什么错。这比到处强制使用流api要好得多。这并不重要,这就是为什么我只是将其psudocoded为
getResults()
。另一个想法是,只要有一个迭代器,我就会一直尝试从中获取内容,直到10个内容匹配为止,或者我已经完成了。。但是我不知道迭代器保持“活动”一段时间是否会有问题?这很重要。如果您处理的是10000行数据库数据,而不是100行内存中的数据,那么您应该做的事情会有很大的不同。我没有意识到您可以同时使用流和迭代器。。我在评论中提到了迭代器,但由于过滤和映射的麻烦,我不太喜欢使用迭代器。这是两全其美。谢谢。我没想到你可以同时使用流和迭代器。。我在评论中提到了迭代器,但由于过滤和映射的麻烦,我不太喜欢使用迭代器。这是两全其美。非常感谢。
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);
});
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());
    }
});