使用某种惰性迭代器的最佳方法是什么,只在请求时评估返回值?

StackOverflow https://stackoverflow.com/questions/1632396

  •  06-07-2019
  •  | 
  •  

import java.util.Collection;

import example.Event;

public interface Query
{
    public boolean hasMore ();

    public Collection<Event> getNext ( long count ) throws Exception;
}

这是我想要实现的界面。

实现应该是这样的:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import example.Event;
import example.Query;

public class ListQuery implements Query {

    public ListQuery(List<Event> events, String filter)
            throws FilterParseException {
        // events is the list of given events
        // filter is a string representation of the filter to apply
    }

    public Collection<Event> getNext(long count) throws Exception {
         // returns max. count next entries which match given filter
    }

    public boolean hasMore() {
        // returns if there are more elements matching the given filter
    }
}

我正在考虑的是hasMore()和getNext()之间的关系。在这两种情况下,我都要评估过滤器是否与列表中的元素匹配。可能我不知道给定列表的实现,所以它可能是一个昂贵的操作。显然我不能从迭代器中使用hasNext(),因为我必须检查Event是否符合给定的条件。在我当前的实现中,我有两个不同的迭代器和当前位置,如果getNext()的迭代器的位置大于hasMore()的迭代器的位置,则向上移动hasMore()的位置。

我真正想做的是克隆当前的迭代器,而迭代器又用于hasMore(),但这显然是不可能的。

这个问题有更优雅的解决方案吗?

有帮助吗?

解决方案

getNext 实现中,在分配返回值之后,可以推进迭代器,直到找到适当的事件。这样, hasMore 可以安全地测试迭代器上的 hasNext ,以确定是否返回 true false 。 / p>

其他提示

不要折磨你自己:-)并且只使用它:

Iterables.filter(Iterable,Predicate)

它为您解决了这些问题。

如果您没有任何Iterable数据,只有Iterator,请参阅相应的类迭代器。如果您需要自己实现Iterator,可能有助于在同一个包中扩展AbstractIterator。

然后,如果您真的想要检索结果块,可以使用Itera *类的partition()方法。

我想你甚至不需要两个迭代器。 hasMore 调用可以一直迭代,直到找到匹配并停留在那里(如果它已经指向的元素匹配,不迭代)。现在 getNext 将使用相同的迭代器来迭代和填充返回集合,直到达到计数或找不到更多匹配元素。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top