Java 返回一个空列表

2022-09-01 00:48:34

我有我的Java方法如下;

public List<Lookup> findAll(String lang) {
    Query query = entityManager.createNamedQuery("Lookup.findAll");
    if (isValidLang(lang)) {
        query.setParameter("lang", lang);
        return query.getResultList();
    } else {
        //return empty list
    }
}

现在,该方法返回 Lang 的有效匹配项的 List。

但是,如果不是这样,我想返回一个空列表。我的问题是我如何更新代码以及返回空列表以使代码不会失败的最佳方法是什么?


答案 1

这应该这样做:

} else { 
    return Collections.emptyList();
}

笔记:

  1. 从java 9开始,除了还有.Collections.emptyList()List.of()
  2. 此构造是最有效的构造,因为它重用空列表的现有实例,因此每次请求空列表时,都不会创建新列表。但是,Java中的对象分配非常便宜,因此这不应该是一个真正的问题。
  3. 由 任一或 返回的列表是秘密不可变的。通过“秘密”,我的意思是它暴露了突变方法,但是如果你错误地调用了这些方法中的任何一个,你就会被打耳光,但有一个例外。在其他比Java更好的语言中(例如,在Scala中),存在不可变/不可修改的集合,但Java没有这种“开箱即用”的东西。因此,如果您在2020年坚持使用Java,那么您将接受这样一种可能性,即并非所有集合都可以写入,尽管它们看起来都好像可以写入。Collections.emptyList()List.of()
  4. 通常,函数旨在返回不可变实体,因此,如果您调用返回集合的函数,然后尝试修改该集合,则操作错误。如果您确实需要一个可以修改的集合,则应改为编写函数,以便它填充作为参数传递给它的可变列表,因此很明显,作为可变列表的所有者,您可以在函数返回后进一步修改该列表。

答案 2

Collections.emptyList()返回一个不可变列表,即,如果要对列表执行任何操作,则无法向其添加元素的列表,然后创建新的 list 实例并将其返回。

if (isValidLang(lang)) {
        query.setParameter("lang", lang);
        return query.getResultList();
    } else {
        return new ArrayList<Lookup>();  // return array list instance.
    }