Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for/break是否比迭代器()更有效。next()?_Java_Foreach_Break - Fatal编程技术网

Java for/break是否比迭代器()更有效。next()?

Java for/break是否比迭代器()更有效。next()?,java,foreach,break,Java,Foreach,Break,众所周知,mapX中只有一个条目。代码度量工具抱怨在循环内部使用“break”,但通常,在这样一个小循环中,我会让它通过。但在这种情况下,由于知道只有一个条目,我不确定哪一个更有效 那么,当您知道映射将只包含一个元素时,以下哪项更有效 可能的替代品: Map.Entry<String,String> e = mapX.entrySet().iterator().next(); Y.setMsg(e.getValue()); Y.setMsgKey(e.getKey()); 就我个人

众所周知,mapX中只有一个条目。代码度量工具抱怨在循环内部使用“break”,但通常,在这样一个小循环中,我会让它通过。但在这种情况下,由于知道只有一个条目,我不确定哪一个更有效

那么,当您知道映射将只包含一个元素时,以下哪项更有效

可能的替代品:

Map.Entry<String,String> e = mapX.entrySet().iterator().next();
Y.setMsg(e.getValue());
Y.setMsgKey(e.getKey());

就我个人而言,我觉得第一个变体更简洁。如果您正在使用,也可以这样写:

Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
    Map.Entry<String,String> e = mapX.entrySet().iterator().next();
    y.setMsg(e.getValue());
    y.setMsgKey(e.getKey());
}
Map.Entry e=Iterables.getOnlyElement(mapX.entrySet());

就我个人而言,我觉得第一个变体更简洁。如果您正在使用,也可以这样写:

Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
    Map.Entry<String,String> e = mapX.entrySet().iterator().next();
    y.setMsg(e.getValue());
    y.setMsgKey(e.getKey());
}
Map.Entry e=Iterables.getOnlyElement(mapX.entrySet());
这个

除了一个例外:循环首先在迭代器上调用
hasNext()

前者更强烈地暗示只有一个元素(至少,只有一个您感兴趣)。后者说“我将循环所有元素…除了第一个元素之后我将停止。”如果不循环,为什么要使用循环

似乎非循环版本才是最合适的

除了一个例外:循环首先在迭代器上调用
hasNext()

前者更强烈地暗示只有一个元素(至少,只有一个您感兴趣)。后者说“我将循环所有元素…除了第一个元素之后我将停止。”如果不循环,为什么要使用循环


似乎非循环版本是应该使用的版本。

第一个版本比第二个版本快(带有“for”循环/“break”):

  • 循环版本必须在调用
    next()
    之前调用
    hasNext()
  • 循环版本正在迭代键集而不是入口集,因此必须执行额外的映射查找以获得相应的值
  • 循环版本可能在
    中断处有一条额外的分支指令。。。虽然这是次要的,而且可能会被JIT编译器优化掉
  • 但是使用第一个版本(IMO)的最佳理由是代码更容易理解/不太复杂。(代码度量工具在这种情况下很有用…)


    当然,另一方面是,如果映射为空,则非循环版本的代码将抛出异常。如果您需要处理“空地图”案例,您应该这样写:

    Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
    
    if (!mapX.isEmpty()) {
        Map.Entry<String,String> e = mapX.entrySet().iterator().next();
        y.setMsg(e.getValue());
        y.setMsgKey(e.getKey());
    }
    
    if(!mapX.isEmpty()){
    Map.Entry e=mapX.entrySet().iterator().next();
    y、 setMsg(e.getValue());
    y、 setMsgKey(e.getKey());
    }
    
    第一个版本比第二个版本快(带有“for”循环/“break”):

  • 循环版本必须在调用
    next()
    之前调用
    hasNext()
  • 循环版本正在迭代键集而不是入口集,因此必须执行额外的映射查找以获得相应的值
  • 循环版本可能在
    中断处有一条额外的分支指令。。。虽然这是次要的,而且可能会被JIT编译器优化掉
  • 但是使用第一个版本(IMO)的最佳理由是代码更容易理解/不太复杂。(代码度量工具在这种情况下很有用…)


    当然,另一方面是,如果映射为空,则非循环版本的代码将抛出异常。如果您需要处理“空地图”案例,您应该这样写:

    Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
    
    if (!mapX.isEmpty()) {
        Map.Entry<String,String> e = mapX.entrySet().iterator().next();
        y.setMsg(e.getValue());
        y.setMsgKey(e.getKey());
    }
    
    if(!mapX.isEmpty()){
    Map.Entry e=mapX.entrySet().iterator().next();
    y、 setMsg(e.getValue());
    y、 setMsgKey(e.getKey());
    }
    
    两个都不用怎么样?如果只有一个条目,你为什么还要有地图?@azurefrog你从我嘴里说出了这句话。如果集合为空,替换是否仍然有效?如果你知道for循环无论如何只运行一次,为什么要中断它?为了避免额外的
    hasNext()
    调用的高成本?生成
    keySet()
    可能更昂贵。不使用这两种方法如何?为什么有地图,如果只有一个条目?@azurefrog你从我口中说出了这些话。如果集合是空的,替换是否仍然有效?如果你知道for循环无论如何只运行一次,为什么要中断它?为了避免额外的
    hasNext()
    调用的高成本?生成
    keySet()
    的成本可能更高。此外,循环版本还有一个额外的映射查找。如果它使用entrySet(),您的描述将是准确的。我没有注意到。。。fixedI本人更喜欢迭代器().next()版本,但不确定是否还有其他原因使用for循环。谢谢@EdwinW
    Iterables.get(iterable,0)
    优于
    iterable.iterator().next()
    ,如果您只需要第一个元素,因为它可以防止创建新的迭代器。不幸的是,
    Iterables
    来自一个库,java没有从标准库提供它。@不幸的是,在这个项目中,除非有很多这样的消息问题,否则添加另一个库是不被接受的。此外,循环版本还有一个额外的映射查找。如果它使用entrySet(),您的描述将是准确的。我没有注意到。。。fixedI本人更喜欢迭代器().next()版本,但不确定是否还有其他原因使用for循环。谢谢@EdwinW
    Iterables.get(iterable,0)
    优于
    iterable.iterator().next()
    ,如果您只需要第一个元素,因为它可以防止创建新的迭代器。不幸的是,
    Iterables
    来自一个库,而java并没有从标准库提供它