首页 > 解决方案 > 如何使用 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) { ... }

标签: javajava-8java-streamoptional

解决方案


如果列表不为空或不为空,则需要对其进行过滤。

这里不需要 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”检查的替代品。

推荐阅读