在将 java steam 应用到列表之前对列表进行空检查

San*_*isy 1 java java-8 java-stream

我有以下代码

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());
Run Code Online (Sandbox Code Playgroud)

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

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

Amo*_*len 6

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

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

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

  • 即使您有很多“item”对象并担心空列表的成本,使用返回单个共享对象的“Collections.emptyList()”也可以解决这个问题。但在 Java 8 及更高版本中,使用默认构造函数创建的空“ArrayList”也非常便宜。 (3认同)
  • @Lino,因为从 Java 8 开始,在您实际将元素存储到数组中之前,它不会分配数组。所以初始状态是一个具有三个字段的轻量级对象。也许,这种优化已经在 J​​ava 7 中了,我不确定。 (2认同)