繁体   English   中英

Java 返回一个空列表

[英]Java return an empty list

我的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 匹配项。

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

这应该这样做:

} else { 
    return Collections.emptyList();
}

笔记:

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

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

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

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

} else { 
    return List.of();
}

试试这样:

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;
}

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);
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM