Google Collections中的懒惰不可修改列表

min*_*das 8 java collections list guava

我正在寻找一个通用的懒惰不可修改列表实现的一个不错的实现来包装我的搜索结果条目.任务的不可修改部分很容易,因为它可以实现,Collections.unmodifiableList()所以我只需要理清懒惰的部分.

令人惊讶的是,谷歌收藏品没有提供任何东西; 而来自Apache Commons Collections的LazyList不支持泛型.

我发现尝试在google-collections之上构建一些东西,但它似乎是不完整的(例如不支持size()),过时的(不能用1.0最终编译)并且需要一些外部类,但可以用作一个好的开始指出建立自己的班级.

是否有人知道LazyList的任何良好实现?如果没有,您认为哪个选项更好:

  • 编写我自己的实现,基于google-collections ForwardingList,类似于Peter Maas所做的;
  • 在Commons Collections LazyList周围编写我自己的包装器(包装器只会添加泛型,所以我不需要在任何地方进行转换,只能在包装器本身中进行转换);
  • 只是写点东西java.util.AbstractList;

欢迎任何其他建议.

编辑:解释为什么我需要一个懒惰的列表.

我有一个Lucene搜索结果(TopDocs),它基本上是Lucene文档的一堆指针.我的搜索结果类将这些指针作为输入并返回由提取的和以其他方式处理的Lucene文档组成的对象列表.通过将所有内容包装到一个惰性列表中,我希望确保在不必要时不进行昂贵的处理.

Kev*_*ion 5

谷歌收藏和番石榴的Lists.transform方法为您提供了所寻求的懒惰.坚持Iterables.transform应该同样好.

但是,如果您还担心结果应该在首次创建时缓存,那么......现在,这是我想出的最好的结果,并且它不会非常令人欣慰:

List<Supplier<ExpensiveResult>> suppliers =
    ImmutableList.copyOf(Lists.transform(keys,
        new Function<Key, Supplier<ExpensiveResult>>() {
          public Supplier<ExpensiveResult> apply(Key key) {
            return Suppliers.memoize(Suppliers.compose(
                myExpensiveFunction(),
                Suppliers.ofInstance(key)));
          }
        }));

return Lists.transform(suppliers, ThisClass.<ExpensiveResult>supplyFunction());

 . . . 

private static <T> Function<Supplier<T>, T> supplyFunction() {
  return new Function<Supplier<T>, T>() {
    public T apply(Supplier<T> supplier) {
      return supplier.get();
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

是的,你可以笑.你可能应该这样做.我......真的不推荐这个.代码可能仍然少于您目前所做的代码.我只是测试了它..它的工作原理.

  • 已有几周的二进制版本,上面提到的API都没有标记为Beta(我认为). (2认同)

min*_*das 4

我实际上已经用不同的方式解决了这个问题。我没有经历懒惰和不可修改的情况,而是简单地实现了java.lang.Iterable<T>. 实施UnsupportedOperationException抛出remove()

我不得不稍微修改一些其他代码部分,放弃一些东西,但我相信这是最好的选择。Iterable允许将其放入 foreach 循环中。

如果这对于处于类似情况的人来说不是一个可行的选择,我很抱歉让您失望,并且非常感谢您的想法。