【问题标题】:Can we achieve Limit functionality similar to database, from Maps.filteKey/Value method provided in Guava library能否通过 Guava 库中提供的 Maps.filteKey/Value 方法实现类似于数据库的 Limit 功能
【发布时间】:2013-12-18 06:46:23
【问题描述】:

需要任何关于我们如何将限制定义为 Google Guava 库提供的 Maps.filterKeys 方法的参数的输入,这样一旦达到限制就无需进一步迭代。

我有以下要求,我有 Map 和 Predicate(在这种情况下为过滤器)。

如下 Maps.filterKeys(myMap, myPredicate);

地图有大约 5000 个键,一旦满足一定次数的谓词,我想要的值。我不想迭代更多,而是返回过滤后的地图。

有什么办法,或者我们需要让guava团队添加相同的输入参数。

【问题讨论】:

    标签: java performance guava


    【解决方案1】:

    Maps.filterKeys().The javadoc 中进行了 0 次迭代,对此进行了解释:

    返回一个映射,其中包含 unfiltered 中的映射,其键 满足一个谓词。返回的地图是unfiltered的实时视图; 一个变化会影响另一个。

    因此,它不会返回经过过滤的地图副本,而是返回经过过滤的视图。

    如果你想要一个过滤后的副本,那么你必须遍历过滤后的映射的 entrySet() 并填充一个新的,直到达到你的限制。

    【讨论】:

    • 谢谢你明白了,但我们可以看到有限的条目。由于在谓词中我无法指定限制。否则我需要按照 Seelenvirtuose 的建议对其进行迭代。
    • 那没有意义。假设您有一个包含 1,000,000 个条目的映射,并且您创建了一个仅保留以“A”开头的键的视图,限制为 10 个条目。视图如何决定 filteredMap.get("Animal") 应该返回什么? Maps.filtered()Map.get() 都不执行迭代。所以他们不能限制任何事情。因此,您需要先进行迭代以创建过滤后地图的有限副本。
    • 也就是说,您可以使用Iterables.limit(Maps.filterKeys(map, predicate).entrySet(), limit) 来获取Iterable 的条目。
    【解决方案2】:

    据我所知,Maps类中的filterKeys方法都返回一个map实现,它只是指定map的一个装饰器,然后使用指定的谓词进行过滤。没有完成迭代过程。您必须明确地遍历地图条目,以便您可以(并且必须)自己实现该行为。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多