迭代器Java,谷歌收藏库;AbstractIterator有问题吗?
我正在使用Google Collections库AbstractIterator实现一个生成器。我这样做时遇到了一个问题;我把它简化为一个更基本的类型,并重现了这个问题。对于它所做的事情来说,这种减少显然是过度的,通过一个Iterable从1计算到numelements
本质上,在下面的代码中,未注释的版本有效,而注释的版本无效(最后提供一个null元素,而不是以最后一个数字结尾)
是我做错了什么,还是图书馆出了问题
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进行比较),但没有效果。我四处寻找了一些关于这方面的文档,但什么也没找到。显然,?:
语法只是一种方便,不是必需的,但仍然
# 1 楼答案
由于使用了三元运算符(条件表达式)和不同的数值类型,因此会得到一个}
NullPointerException
。Java在三元表达式中混合不同类型的数值时有复杂的规则:^{假定
endOfData()
在前面返回Integer
,而localcount
是int
,Java将endOfData()
的值解装箱。但是,假定endOfData()
返回空值,取消装箱操作将导致空指针异常您可以继续使用if语句,或者将localcount声明为
Integer
# 2 楼答案
我想问题在于您使用后增量运算符,以及三元运算符。因为这两个片段应该是完全等效的——如果它们不是抽象迭代器的错,那就很难说是抽象迭代器的错,因为此时没有调用它的任何代码