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

Mau*_*uli 1 java collections iterator

import java.util.Collection;

import example.Event;

public interface Query
{
    public boolean hasMore ();

    public Collection<Event> getNext ( long count ) throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的界面.

实现应该是这样的:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我真正想做的是克隆当前的迭代器,我将反过来将其用于hasMore(),但这显然是不可能的.

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

Kev*_*ion 5

不要折磨自己:-)然后使用这个:

Iterables.filter(Iterable,Predicate)

它会为您解决这些问题.

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

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