Java返回一个空列表

jei2mxaa  于 2023-01-19  发布在  Java
关注(0)|答案(5)|浏览(872)

我有如下的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。
但如果不是这样的话,我想返回一个空列表,我的问题是我如何更新代码&返回一个空列表使代码不会失败的最好方法是什么?

bf1o4zei

bf1o4zei1#

如果您使用的是java 9或更高版本:

} else {
    return List.of();
}

如果您坚持使用9:

} else { 
    return Collections.emptyList();
}

注:
1.这些构造是最有效的,因为它们重用了空列表的一个已有示例,所以每次请求空列表时,都不会创建新列表。然而,Java中的对象分配非常便宜,所以这不应该成为一个真正的问题。

  1. List.of()Collections.emptyList()返回的列表是***秘密地不可变的***。我的意思是它公开了变异方法,但是如果你错误地调用了其中的任何一个方法,你将遇到运行时异常。在其他比Java更好的语言中,(例如,在Scala中,)存在不可变/不可修改的集合,但Java没有这样开箱即用的东西,所以,如果你在2020年坚持使用Java,你接受了这样一种可能性,即不是你所有的集合都可以被写入,尽管事实上它们看起来都可以被写入。
    1.一般来说,函数是用来返回不可变的实体的,所以如果你调用一个返回集合的函数,然后你打算修改这个集合,你就做错了。如果你真的需要一个可以修改的集合,你应该写你的函数,让它填充一个可变列表,你把它作为一个参数传递给它,这样很明显你,作为可变列表的所有者,可以在函数返回后自由地进一步修改列表。
v7pvogib

v7pvogib2#

Collections.emptyList()返回一个**不可变的列表***,也就是说,如果你想对你的列表执行任何操作, 你不能向它添加元素,* 然后创建一个新的list示例并返回它。

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

z2acfund3#

对于Java 9,现在可以使用静态工厂方法List::of来创建一个不可变的空列表:

} else { 
    return List.of();
}
zaq34kh6

zaq34kh64#

试试这样:

public List<Lookup> findAll(String lang) {
    List<Lookup> result = new ArrayList<Lookup>();
    Query query = entityManager.createNamedQuery("Lookup.findAll");
    if (isValidLang(lang)) {
        query.setParameter("lang", lang);
        result = query.getResultList();
    }
    return result;
}
xxslljrj

xxslljrj5#

java中使用ternary operator (boolean_expression ? statement1 : statemetn2 ),我们可以检查每个返回类型是否为null。如果我们这样做一次,那么使用该代码的每个调用方法都会受益,因为它们不必检查null。您的代码可以重写如下-

public List<Lookup> findAll(String lang) {
    Query query = entityManager.createNamedQuery("Lookup.findAll");
    ArrayList lookupList = null;

    if (isValidLang(lang)) {
        query.setParameter("lang", lang);
        lookupList = <ArrayList> query.getResultList();
    }

    return (null != lookupList ? lookupList : Collections.EMPTY_LIST);
}

相关问题