我有下面的代码,它可以处理两个值,即String
的List
和String
。List
和String
都可以是null
。
List<String> myStringList = getMyStringList(); // may return null
String myString = "abc"; // may be null
List<String> finalStringList = Optional.ofNullable(myStringList)
.map(strings -> strings.stream()
.filter(obj -> StringUtils.isEmpty(myString)
|| myString.equals(obj))
.collect(Collectors.toList()))
.orElseGet(ArrayList::new);
其思想是:如果myStringList
是null
,则得到空的ArrayList
。如果myString
是null
,则原样返回myStringList
。如果myString
不为空,则循环遍历列表并返回所有匹配myString
的项。
问题是,使用上面的解决方案,即使myString
为空,我仍然循环遍历整个列表(strings.stream
)。
假设myStringList
非常大,那么在myString
为空的情况下,如何避免循环列表呢?
就是说
1)对列表做一个空值检查。2如果为空,返回一个新的空列表。
2)在myString
上做一个空值检查。如果为空值,则不带循环返回列表。
3)如果myString
不为空,则循环遍历列表并返回过滤后的列表。
4条答案
按热度按时间kknvjkwl1#
你可以用三元的,
或者一个基本的
if
,默认为空列表。68bkxrlz2#
这可能适合您(使用Java 9+):
如果您使用的是Java 8,下面的代码应该可以工作,但看起来有点难读:
nkhmeac63#
其他解决方案
muk1a3rh4#
就我个人而言,我认为
if-else
的代码将更具可读性/可维护性/效率:好吧,如果你真的想避免写几行代码,试试我的库:abacus-common