Java 什么';iterator=null和hasnext=false之间的区别是什么?

Java 什么';iterator=null和hasnext=false之间的区别是什么?,java,list,null,iterator,listiterator,java-stream,java-8,Java,List,Null,Iterator,Listiterator,Java Stream,Java 8,我正在编写一个代码来展平2d列表,比如[[1,2],[3],[4,5,6]。我希望它们在一个列表中,如[1,2,3,4,5,6]。 当我想检查coliter是否在一行的末尾时,我想让它们换到下一行 while ((colIter == null || !colIter.hasNext()) && rowIter.hasNext()) 当我这样做的时候,我在想colIter==null和之间有什么区别!colIter.hasNext() 专用迭代器rowIter; 专用迭代器co

我正在编写一个代码来展平2d列表,比如
[[1,2],[3],[4,5,6]
。我希望它们在一个列表中,如
[1,2,3,4,5,6]
。 当我想检查coliter是否在一行的末尾时,我想让它们换到下一行

while ((colIter == null || !colIter.hasNext()) && rowIter.hasNext())
当我这样做的时候,我在想
colIter==null
之间有什么区别!colIter.hasNext()

专用迭代器rowIter;
专用迭代器colIter;
公共解决方案2(列表2){
rowIter=vec2d.iterator();
colIter=Collections.emptyIterator();
}
@凌驾
公共整数next(){
返回colIter.next();
}
@凌驾
公共布尔hasNext(){
while((colIter==null | | |!colIter.hasNext())和&rowIter.hasNext()){
colIter=rowIter.next().iterator();
}
return colIter!=null&&colIter.hasNext();
}
@凌驾
公共空间删除(){
while(colIter==null&&rowIter.hasNext()){
colIter=rowIter.next().iterator();
if(colIter!=null){
colIter.remove();
}
}
}
Q:我正在编写一个代码来展平2d列表,如
[[1,2],[3],[4,5,6]
。我希望它们位于一个列表中,如
[1,2,3,4,5,6]

A:为简洁起见,请使用使结构平坦的功能:

List<Integer> list = vec2d.stream().flatMap(List::stream).collect(Collectors.toList());
List List=vec2d.stream().flatMap(List::stream).collect(Collectors.toList());
在版本之前,对于此问题,每个用法都有足够的可用性

Q:…colIter==null和
!colIter.hasNext()
之间有什么区别

A:colIter==null检查迭代器本身是否为null。默认情况下,从任何现有集合返回迭代器都不会产生类似的迭代器


colIter.hasNext()
是从迭代器调用的一个方法,如果迭代包含更多元素,则根据其返回值
true
,这意味着后续调用将返回一个元素,并且如果使用嵌套列表,则不会抛出
NoSuchElementException

[ [1,2], [3], [4,5,6] ]
…你可以用另一种方式来思考

0: [1, 2]
1: [3]
2: [4, 5, 6]
也就是说,由于列表的嵌套属性,列表具有二维表示形式。第0行包含值1和2,第1行包含值3,第2行包含值4、5和6

当你写作时

colIter == null || !colIter.hasNext()) && rowIter.hasNext()
您要检查的是:

  • 有专栏吗?
  • 如果有,,
    • 我们是否已经用尽了列迭代,我们是否有更多的东西要从行中读取
以这种方式考虑嵌套列表:

0: [1, 2]
1: []
2: [3, 4, 5]
对于第1行,肯定有一个列,但我们没有任何值要处理,而且还有其他事情要做,所以我们可以越过这个记录


如果我们在嵌套列表的末尾,那么我希望调用
colIter.next()
抛出一个
NoTouchElementException
而不是返回
null
。您可能需要对此进行研究。

一个是检查对象是否存在,另一个是从对象获取信息?如果这真的是您的全部要求,那么您的问题中有很多无关信息。您可能应该将其关闭o更清楚一点。在上面的代码中,colIter==null在任何情况下都不能为true,因为您总是将其设置为非null对象。!colIter.hasNext()检查当前的colIter迭代器是否已到达列表的末尾,并且没有任何下一个元素。建议streams与讨论无关。让他们在依赖语法糖之前找出如何执行该操作。我已经仔细阅读了您的答案,并对我的评估保持坚定。非常好的解释!谢谢!
0: [1, 2]
1: []
2: [3, 4, 5]