【发布时间】:2020-03-02 12:57:15
【问题描述】:
我有以下代码适用于两个值,即。 List 的 String 和 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) 对列表进行空检查。如果为 null,则返回一个新的空列表。
2) 对myString 进行空检查。如果为 null,则按原样返回列表而不循环。
3) 如果myString 不为null,则循环遍历列表并返回过滤后的列表。
【问题讨论】:
-
为什么你不使用简单的 if 检查。
-
最佳解决方案:修复
getMyStringList()以返回空列表而不是null。 -
相关且很好读:How to best create a Java 8 stream from a nullable object?(我建议这个问题与那个问题部分重复)
-
@Vicky 如果你能用
myString和myStringList的存在和缺席的所有 4 种可能组合来得出期望值,那么问题就很清楚了。
标签: java java-stream optional