【问题标题】:Can we add additional stopping condition in iterator for-loop?我们可以在迭代器 for 循环中添加额外的停止条件吗?
【发布时间】:2016-04-19 02:57:00
【问题描述】:

在常规循环中,我们可以有如下,制作单个嵌套层。

for (int i=0; listObject != null && i < listObject.size(); i++) {
    // Do whatever we want
}

但是,对于每个循环使用以下样式,我需要一个双嵌套代码:-

if (listObject != null) {
    for (Object object: listObject) {
        // Do whatever we want
    }
}

是否可以将 listObject != null 条件嵌入到 for 循环语句中以使其成为单个嵌套代码?

【问题讨论】:

  • 为什么在循环的每次迭代中都需要检查listObject是否为空?是否有代码可以取消引用它?
  • 那里已经问过同样的问题 IMO:stackoverflow.com/questions/6077909/…
  • “null”检查是一个比较典型的例子。它的想法是,如果我们有另一个条件要检查,有没有办法让它仍然是单嵌套的。我在下面提供了我的答案版本。谢谢!
  • 为了有一个更扁平的代码结构,我可以先做一个规范化,比如if(list==null) list=emptyList();

标签: java for-loop coding-style


【解决方案1】:

您的第二个示例是清晰易懂的代码。在 if 块中嵌套 for 循环没有任何问题。这比你的第一个例子更清楚。

但如果你坚持要组合它们,你可以使用三元运算符在listObject 为空时提供一个空列表。使用Collections.emptyList 意味着不会发生迭代,也不会抛出NullPointerException

for (Object object : listObject == null ? Collections.emptyList() : listObject)

如果已经存在诸如第二个示例之类的清晰示例,我认为我不会使用这样的代码,但是此代码确实提供了一种在 for 循环中获取两个冒号的方法。

【讨论】:

  • 谢谢@rgettman。鉴于它直接回答了我的问题,我会给这个答案打勾。我有我自己的方法版本,虽然不那么直接。也会写作为对此的一个答案(如果有的话,请检查并发表评论)。谢谢!
【解决方案2】:

为了简洁起见,在有一个嵌套循环的同时,我决定将它变成如下函数

void checkCondition(List<Object> listObject) {
   if (listObject == null) return;

   for (Object object: listObject) {
       // Do whatever
   }
}

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2021-06-13
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多