Java、谷歌集合库; AbstractIterator 的问题?

标签 java iterator guava iterable

我正在使用 Google Collections 库 AbstractIterator实现一个生成器。我在做的过程中遇到了一个问题;我已将其简化为更基本的类型并重现了该问题。对于通过 Iterable 从 1 计数到 numelements 的作用来说,这种减少显然是多余的。

本质上,在下面的代码中,未注释的版本有效,而注释的版本则无效(最后提供一个空元素,而不是以最后一个数字结尾)。

我做错了什么,还是库有问题?

private Iterable<Integer> elementGenerator(final int numelements) {
  return new Iterable<Integer>() {
    @Override public Iterator<Integer> iterator() {
      return new AbstractIterator<Integer>(){
        int localcount=0;
        @Override protected Integer computeNext() {
          if (localcount++ == numelements) return endOfData();
          return localcount;
          // return (localcount++ == numelements) ? endOfData() : localcount;
        }
      };
    }
  };
}

我还尝试摆弄 ?: 安排(例如,为返回添加前缀并与 +1 进行比较),但无济于事。我四处寻找有关此的文档,但没有找到任何内容。显然, ?: 语法只是一种方便,不是必需的,但仍然......

最佳答案

由于使用了具有不同数值类型的三元运算符、条件表达式,您会得到一个 NullPointerException。 Java在三元表达式中混合不同类型的数值时有复杂的规则:JLS Section 15.25 .

鉴于 endOfData() 被认为返回 Integer,而 localcountint,Java 取消装箱endOfData() 的值。但是,鉴于 endOfData() 返回 null,拆箱操作会导致空指针异常。

您可以继续使用 if 语句,或将 localcount 声明为 Integer

关于Java、谷歌集合库; AbstractIterator 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821510/

相关文章:

java - 如何mock jcabi注解参数

python - 在类的 __iter__ 方法中生成字典键、值对

java - 如何将 iterable 与继承结合使用

java - 如何将函数应用于每个集合元素以便在 Guava 中对其进行变异?

java - 如何设计一个持有 java.lang.String 的不可变值类?

java - 在单个表达式中解包 Guava Optional

java - JDBC:将 Clob 转换为字符串不显示\n 行返回

java - 可运行的问题

java - 如何在jsp页面上以单独的日期和时间显示本地日期时间?

STL - 带有迭代器但没有容器的 c++ 类