当前位置: 首页 > 知识库问答 >
问题:

收集后继续java流

罗学真
2023-03-14

我有一个列表,我想用流过滤,抓取前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+多个不匹配的过滤器上运行过滤器(再次)。

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);
});

共有1个答案

佟英武
2023-03-14

您可以将流转换为迭代器,并调用next()10次。迭代器将在每次下一次()调用时获得lazy的计算值。

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());
    }
});
 类似资料:
  • 问题内容: 鉴于流,例如, 如何最优雅地将其转换为给定形式: (当然,假设我已经定义了Pair类)? 编辑:这不严格有关整数或原始流。对于任何类型的流,答案应该是通用的。 问题答案: 我的StreamEx库扩展了标准流,它pairMap为所有流类型提供了一种方法。对于原始流,它不会更改流类型,但可用于进行一些计算。最常见的用法是计算差异: 对于对象流,你可以创建任何其他对象类型。我的库没有提供任何

  • 问题内容: 我有一个JavaScript代码,需要向其中添加睡眠/等待功能。我正在运行的代码已经在一个函数中,例如: 我听说可能的解决方案可能包括 但我不确定在这种情况下如何使用它。 我不能使用PHP,因为我的服务器不支持PHP,尽管使用jQuery可以。 问题答案: JS没有睡眠功能,它具有 setTimeout() 或setInterval() 函数。 如果您可以将暂停后需要运行的代码移到回调

  • 我正在创建一个应用程序,其中我从服务器下载一些数据。在后台运行时,我希望连接应该继续运行,以便可以下载数据。我知道在app里有方法 当应用程序进入后台时调用。但由于连接是在viewController中创建的,如何在appDelegate中管理它 还有其他方法可以做到这一点吗?我已经通过了这个链接,但是有一个简单的实现方法吗?

  • 问题内容: 是否有可能继续进行后? 除了检索引发异常的行的ID,然后重新启动忽略该ID,我看不到该怎么做。 我正在使用Oracle数据库10。 问题答案: 您可以使用error_logging_clause进行此操作。(该链接用于插入内容,因为在MERGE的文档中,它表示其行为与插入内容相同。 对于您的情况: 请注意,error_logging_clause有一些限制。从文档中: 以下情况导致该语

  • 给定诸如之类的流, 我怎样才能最优雅地将它转换成给定的形式: (当然,假设我定义了类对)? 编辑:这不是严格的关于int或基元流。对于任何类型的流,答案都应该是通用的。

  • 跳过当前循环的剩余部分并继续下一次循环。在各种循环中都是有效的。 Continue [, LoopLabel] [AHK_L 59+]:如果指定了,则 LoopLabel 表示此语句所应用的循环;通过标签名或嵌套层级的数值。如果省略或为 1,此语句应用于它所在的最内层循环。LoopLabel 必须为常量,不支持变量和表达式。如果指定标签,则它必须直接指向循环命令。 Continue 的行为如同直接