如何使用Java8处理可空列表?
我正在打一个服务电话并试图处理回复。 响应可能有一个列表。该列表可能为空
此外,如果列表不为null或不为空,则 它需要过滤。 在代码中,如果过滤不提供任何内容或响应列表为空或null,则“entry”引用可能为null
当前,当我尝试在空响应列表上使用stream()时,我得到了NPE。 我如何处理这种情况
@Getter
public class ServiceResponse {
List<ResponseEntry> entryList;
}
@Getter
public class ResponseEntry {
String value;
}
ServiceResponse serviceResponse = service.getServiceResponse();
ResponseEntry entry = serviceResponse.getEntryList()
.stream()
.filter(e -> "expectedValue".equals(e.getValue()))
.findFirst()
.orElse(null);
if (entry == null) { ... }
# 1 楼答案
这里不需要可选的,因为它不打算取代简单的
if
检查responseEntries
不为空且responseEntries
不为空,则应用筛选操作并查找第一项,否则为空”。非常可读李>另一方面,可选方法:
# 2 楼答案
在Java 9中,可以使用新方法^{} :
Apache Commons Collections实际上有一个方法^{} ,如果参数列表是^{,它将返回一个空列表。这甚至更好,但在JavaSE中
Objects.requireNonNullElse
是最接近它的东西如果您仅限于Java 8,那么我同意Aomine的回答,即尝试执行
Optional
之类的操作比if
语句更糟糕# 3 楼答案
^{} (Java-9)
当前代码
更新代码
^{} (Java-9)
^{} (Java-11)
# 4 楼答案
另一种选择是使用
Optional
monad:如果您的目标是构建(并返回)一个值,而不是执行副作用,那么甚至可以使用^{} 而不是
if
语句# 5 楼答案
您可以简单地使用三元运算符:
有时候,传统的更好