Java 迭代器对 Next() 施加条件

Posted

技术标签:

【中文标题】Java 迭代器对 Next() 施加条件【英文标题】:Java Iterator Impose Condition on Next() 【发布时间】:2012-06-27 07:44:27 【问题描述】:

我对 Java 中的迭代器有点困惑。如何使 next() 仅返回某些值?比如说我有一个由 10 个元素组成的布尔数组,我只想返回那些为真的。我是否在 next() 方法中放置了一个条件来检查该条件并在满足时返回?还是在实际使用迭代器时检查条件并继续调用 next() 直到获得合适的值,然后使用该值?

类似地,如果我有一个整数数组,并且我想创建数组的字符串表示形式,其中每个元素用空格分隔,但我只想使用负元素。如果我想使用迭代器执行此操作,我是在 next() 方法中检查负元素并仅返回下一个负值,还是检查何时进行字符串表示,并继续调用 next( ) 直到我得到一个负值,然后将该值添加到字符串中?

谢谢!

【问题讨论】:

【参考方案1】:

Normal Java iterators 只是遍历集合的每个元素。因此,您必须在每次迭代时自己检查值。

您编写的内容可以使用来自Apache Commons Collections 的FilterIterator 类来完成。

来自 JavaDoc:

这个迭代器修饰底层迭代器,只允许通过那些匹配指定Predicate的元素。

下面是一个帮助您入门的示例:

// Create a predicate class, like this:
class MyAwesomePredicate implements Predicate 

    @Override
    public boolean evaluate(Object object) 

        // If the condition is satisfied, return true.
        // Return false otherwise.

         


// and pass it to the FilterIterator:
Iterator<SomeClass> matchingObjects = 
    new FilterIterator(myCollection.iterator(), new MyAwesomePredicate());

// Now iterate the maching objects:
while (machingObjects.hasNext() 

    // do your stuff


更新:如果您愿意,还有来自Guava 的Iterators#filter(Iterator&lt;T&gt;, Predicate&lt;? super T&gt;)。与 Apache Commons 不同,它支持泛型,并且(可以说)更高的coolness factor

【讨论】:

这似乎是一个有趣的解决方案。 +1 我今天学到了一些东西,现在还不到早上 9 点【参考方案2】:

从技术上讲,两者都是可行的,所以这实际上是一个设计问题。如果您确定每次迭代该 Iterable 结构时都需要该条件,而不是使用 Iterator 子类的 next() 方法中的条件,否则,您最好在 Iterator 之外签入您的应用程序。

此外,next() 方法中的测试可能会提高性能,因为您将在应用程序代码中迭代较少数量的元素。因此,如果性能是一个问题,也许这是一个好主意。

【讨论】:

【参考方案3】:

Iterator 用于遍历集合,并将逐个返回每个元素。没有其他方法可以使用Iterator,因此请检查迭代或创建自己的特殊迭代器。

【讨论】:

【参考方案4】:

迭代器的概念非常简单:它在元素集合上隐藏(封装)遍历算法的实现。 您调用 next - 它获取集合中的下一个元素,由您决定如何使用此值。通过使用迭代器,您不依赖集合的内部实现。 当然你可以创建你自己的迭代器(它应该实现 java.util.Iterator 接口),但我相信你问的不是必需的:) 希望这会有所帮助

【讨论】:

以上是关于Java 迭代器对 Next() 施加条件的主要内容,如果未能解决你的问题,请参考以下文章

什么是迭代器

用auto和iterator迭代器对元素赋值比较

Python3 迭代器

Python迭代器

Stream和迭代器的区别

012python路--迭代器