首页 > 解决方案 > 在将 java steam 应用到列表之前对列表进行空检查

问题描述

我有一个下面的代码

item.getSubCategory().stream().map(category -> {
              return subCategoriesList.add(new SubCategoryViewModel(
                      category.get(String.format("_%s",categoryProperties[0])).toString(),
                      category.get(categoryProperties[2]).toString(),
                      category.get(categoryProperties[3]).toString()));
            }).collect(Collectors.toList());

item.getSubCategory()是类别模型的列表。现在,如果 null 出现在getSubCategory我们会得到一个空指针异常并且不能对其应用蒸汽。在将流应用于列表之前,是否有更好的方法来处理对列表的空检查。

我不想使用IF语句来检查 null getSubCategory。java steam API有没有更好的方法?

标签: javajava-8java-stream

解决方案


返回列表的方法永远不应该返回null- 这是一种非常糟糕的做法。只需在构造函数中初始化列表,如果没有添加任何对象,则返回一个空列表。这样,您就可以消除所有需要的空检查,只要您想使用getSubCategory.

可以说你最终得到了一个占用内存的未使用对象。但是,除非您有很多item对象,否则拥有一些“备用”列表不会伤害任何人。请记住,在大多数情况下,代码可读性是第一位的——当您看到实际问题时修复性能。

编辑:正如 Holger 所建议的,如果您担心那些空列表的内存成本,您可以使用Collections.emptyList(). 在您的内部,您item将所有内容保持原样,仅在需要时创建列表等。但是,在内部getSubCategory而不是返回null,您应该检查列表是否已初始化,如果未初始化,则返回Collections.emptyList()代替 null。根据文档,Collections.emptyList()返回一个不可变的列表实例,多次调用将返回同一个实例——只会创建一个。


推荐阅读