【问题标题】:what is the best way to check whether the list is null or not before looping?在循环之前检查列表是否为空的最佳方法是什么?
【发布时间】:2011-03-29 05:47:04
【问题描述】:

我知道这是一个原始问题,但我想以最聪明的方式学习。

我想遍历ArrayList<Integer> intList,它可以为空。我有两种方法

if(intList != null) {
     for(int i = 0; i < intList.size(); i++){
             System.out.println(intList.get(i));
     }
}

for (int i = 0; intList != null && i < intList.size(); i++){
     System.out.println(intList.get(i));
}

第一种方式对我来说似乎更漂亮。你怎么看?在这种情况下你的实现是什么?

对不起,如果是重复的问题,但我找不到一个

谢谢

【问题讨论】:

    标签: java null for-loop


    【解决方案1】:

    在这种情况下,我也会选择第一个实现,因为它的意图更清晰。

    一般来说,我会尽量避免List(或任何其他Collection 对象,真的)是null。在评估List(突然而出乎意料地是null)时,您很可能希望在任何处理发生之前中止,这样任何一种循环遍历集合的情况都不会发生。

    【讨论】:

    • +1 同意首先更清楚,避免 List 成为 null 开头。如果可能且适当,创建List 的方法应考虑返回Collections.&lt;Integer&gt;emptyList()
    • 第一个是常见且简单的习语,而第二个是不寻常的,因此开发人员需要额外的时间来弄清楚为什么它不同。除非您有充分的理由不这样做,否则请选择普通和简单的。
    【解决方案2】:

    我们公司有一个发展规律:

    • 如果编写的函数返回列表或数组,永远不要返回 null!在没有要返回的元素的情况下返回空列表或空数组。

    这可以用最少的开销完成,如下所示:

    public List<String> getNames() {
        if( !loaded ) {
            return Collections.emptyList();
        }
        ...
    }
    

    如果应用得当,您不必检查空列表。我们不必这样做。

    编辑: 哦,回到您手头的问题:使用 forst 变体,它更清晰、更快,因为空值检查只需执行一次(它可能无论如何编译器都会将其排除在外,但在变体 1 中您可以确定)。

    【讨论】:

    • “Effective Java”(第 2 版)中的第 43 条同意您的观点:“返回空数组或集合,而不是 null”
    • 您可以通过java.sun.com/docs/books/effective的链接阅读有关泛型(第 23 至 29 项)一章的 PDF 文件
    • 谢谢。如果我在某个地方找到一个,我想我会购买一个下载版本。
    【解决方案3】:

    我更喜欢第一个,因为完整的代码段很可能是:

    if(intList != null) {
     for(int i = 0; i < intList.size(); i++){
             System.out.println(intList.get(i));
     }
    }
    else {
       //Do something here.
    }
    

    【讨论】:

      【解决方案4】:

      我更喜欢第一个,因为我主要使用第一个过程

      【讨论】:

        【解决方案5】:

        对我来说,第一个选项更清晰,更易于阅读和理解。

        【讨论】:

          【解决方案6】:

          在我看来,第一个选项应该是首选,因为它的可读性比第二个更好,而第二个为您节省了一行额外的代码。

          一天结束时,两者都会做同样的事情,所以由你决定,你想使用哪个代码。我建议坚持首先,因为它对开发人员更友好,因为它具有可读性。

          【讨论】:

            【解决方案7】:

            第一种形式更具可读性 - 意图更清晰。

            第一种形式可能也更快,因为第二种形式表示要测试intList 不为空每次您绕过循环。 (JIT 编译器可能优化掉不必要的测试......但为什么要依赖这个。)

            【讨论】:

              猜你喜欢
              • 2020-12-08
              • 1970-01-01
              • 2017-08-23
              • 2021-02-25
              • 1970-01-01
              • 1970-01-01
              • 2012-08-29
              • 1970-01-01
              • 2017-06-05
              相关资源
              最近更新 更多