【问题标题】:Iterator of iterable object should return the iterable object itself in Java可迭代对象的迭代器应在 Java 中返回可迭代对象本身
【发布时间】:2020-01-24 00:23:41
【问题描述】:

假设您在 Java 中给出了一个扩展 Iterable 接口的类。这个类必须提供一个Iterator,它应该返回周围类的实例,看看main方法。

public class Test implements Iterable<Test> {

    @Override
    public Iterator<Test> iterator() {

        return new Iterator<Test>() {
          private boolean onlyOnce = false;

            @Override
            public boolean hasNext() {
                return false;
            }

            @Override
            public Test next() {         
               if (!onlyOnce) {
                 onlyOnce = true;
                 // TODO return
               } 
               throw new NoSuchElementException("Iterator has already been called");
            }
        };
    }
    public static void main(String[] args) {

        Test test = new Test();
        Test test2 = test.iterator().next();

        boolean b = test == test2; // should be true
    }

}

如何在 Java 中解决这个问题?

【问题讨论】:

  • 真的不清楚你想要达到什么目的......但是...... return Test.this;?
  • 我什至不确定“这个问题”是什么。迭代你已经拥有的对象是没有意义的。我认为这里有一个 XY 问题。
  • 这没有意义,所以不确定你要做什么。你忘了什么吗? // TODO return
  • hasNext() 应该在第一次调用时返回true;此后它应该返回false。所以让它返回!onlyOnce。或者反转onlyOnce的极性(称它为firstTime并将其初始化为true)。

标签: java iterator


【解决方案1】:

为了返回 Test 的封闭实例,请使用限定的 this:

return Test.this;

但是,实现该方法的一种更简洁的方法是使用现有的迭代器实现:

@Override
public Iterator<Test> iterator() {
  return Arrays.asList(this).iterator();
  // or Collections.singleton(this).iterator()
  // or Stream.of(this).iterator()
  // or many other possibilities.
}

【讨论】:

  • 也可以考虑Collections.singleton(this).iterator(),它甚至不需要分配一个数组。
  • 谢谢!不知道获取类型的封闭实例的机会,例如“Test.this”。这个“操作员/技术”怎么称呼?它是 Java 的新特性吗?
  • @mrbela 如答案所述,它是"qualified this"。不,它不是新的。
  • @AndyTurner 对我的问题有任何想法:stackoverflow.com/questions/59885424/…
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多