java - 如何使用 java 8 处理可空列表?
问题描述
我正在拨打服务电话并尝试处理响应。响应可能有一些东西的列表。该列表可能为空。
此外,如果列表不为空或不为空,则需要对其进行过滤。如果过滤没有给出任何内容或响应列表为空或为空,则代码中的“条目”引用可能为空。
目前,当我尝试在空响应列表上使用 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) { ... }
解决方案
如果列表不为空或不为空,则需要对其进行过滤。
这里不需要 Optional,因为它不是为了取代简单的if
检查。
ResponseEntry entry = null;
List<ResponseEntry> responseEntries = serviceResponse.getEntryList();
if(responseEntries != null && !responseEntries.isEmpty()){
entry = responseEntries.stream()
.filter(e -> "expectedValue".equals(e.getValue()))
.findFirst()
.orElse(null);
}
- 读取“如果
responseEntries
不为空responseEntries
且不为空,则应用过滤器操作并找到第一项,否则为空”。非常可读。
另一方面,可选方法:
ResponseEntry entry = Optional.ofNullable(serviceResponse.getEntryList())
.orElseGet(() -> Collections.emptyList())
.stream()
.filter(e -> "expectedValue".equals(e.getValue()))
.findFirst();
if(!entry.isPresent()){ ... } // or entry.ifPresent(e -> ...) depending on the logic you're performing inside the block
- 不必要地创建了可以避免的对象,而不是真正的 optional 意图用作简单的“if”检查的替代品。
推荐阅读
- python - 如何在同一个浏览器上打开两个链接
- java - 解析具有相同主体的其他类使用改造
- android - 实现对角文本视图/布局效果
- python - 通过 google colab 安装 python 3.7 作为默认 python
- c++ - 检测无向图代码中的循环时出错
- angular - 如何使用 MergeMap 或 FlatMap 或使用 rxJs-operators 的更好方法编写以下代码?
- javascript - AWS Amplify Authenticator UI 确认登录错误
- javascript - 通过在客户端拦截向 XMLHttpRequest 发送自定义响应
- javascript - 有没有办法在没有认知用户池和身份池的情况下使用 AWS Amplify 库 (JavaScript) 访问 s3 存储桶?
- python-3.8 - Django-jenkins --enable-coverage 返回“覆盖”对象没有属性“数据”