如何使用Java8处理可空列表?

如何使用Java8处理可空列表?,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我正在打一个服务电话并试图处理回复。 响应可能有一个列表。该列表可能为空 此外,如果列表不为null或不为空,则 它需要过滤。 在代码中,如果过滤不提供任何内容或响应列表为空或null,则“entry”引用可能为null 当前,当我尝试在空响应列表上使用stream()时,我得到了NPE。 我如何处理这种情况 @Getter public class ServiceResponse { List<ResponseEntry> entryList; } @Getter p

我正在打一个服务电话并试图处理回复。 响应可能有一个列表。该列表可能为空

此外,如果列表不为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) { ... }
@Getter
公共类ServiceResponse{
列表条目列表;
}
@吸气剂
公共课堂反应{
字符串值;
}
ServiceResponse ServiceResponse=service.getServiceResponse();
ResponseEntry条目=serviceResponse.getEntryList()
.stream()
.filter(e->“expectedValue.”等于(e.getValue())
.findFirst()
.orElse(空);
如果(entry==null){…}

如果列表不为null或不为空,则需要对其进行筛选

此处不需要可选,因为它不打算在检查时替换简单的

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);
}
  • 不必要地创建可以避免的对象,而不是真正的可选对象,以替代简单的“如果”检查

在Java 9中,您可以使用新方法:

ApacheCommons Collections实际上有一个方法,如果参数列表为
null
,它将返回一个空列表。这甚至更好,但是在JavaSE中,
Objects.requireNonNullElse
是最接近它的东西

如果您仅限于Java 8,那么我同意Aomine的回答,即尝试执行类似于遍历
可选
的操作比执行
If
语句更糟糕。

(Java-9) 返回包含单个元素的连续流(如果非null), 否则返回一个空流

现行代码
(Java-11) 如果值不存在,则返回true,否则返回false

Optional entry=Optional.ofNullable(serviceResponse.getEntryList())//可选
.OrelGet(Collections::emptyList)//或空列表
.stream()//流
.filter(e->“expectedValue”。.equals(e.getValue())//filter
.findFirst();//可选的
如果(entry.isEmpty()){/!entry.isPresent在java-8中
//你在这里工作吗
}

您可以简单地使用三元运算符:

ServiceResponse serviceResponse = service.getServiceResponse();
List<ResponseEntry> list = serviceResponse.getEntryList();

ResponseEntry entry = (list == null ? Collections.emptyList() : list)
    .stream()
    .filter(e -> "expectedValue".equals(e.getValue()))
    .findFirst()
    .orElse(null);

if (entry == null) { ... }
ServiceResponse-ServiceResponse=service.getServiceResponse();
List List=serviceResponse.getEntryList();
ResponseEntry=(list==null?Collections.emptyList():list)
.stream()
.filter(e->“expectedValue.”等于(e.getValue())
.findFirst()
.orElse(空);
如果(entry==null){…}

有时候,我觉得传统的更好。

另一种选择是使用
可选的

Optional entry=Optional.ofNullable(servicesponse.getEntryList()).flatMap(列表->
list.stream().filter(e->“expectedValue”.equals(e.getValue()).findFirst()
);
如果(!entry.isPresent()){
…
}

如果您的目标是构建(并返回)一个值,而不是执行一个副作用,那么您甚至可以使用
if
语句来代替该语句。

为什么列表可能为空?不带回复的列表值方法的首选返回是
emptyList()
Objects.requireNonNullElse(serviceResponse.getEntryList(),
                           Collections.emptyList())
ResponseEntry entry = serviceResponse.getEntryList() // List<ResponseEntry>
        .stream() // NPE here   // Stream<ResponseEntry>
        .filter(e -> "expectedValue".equals(e.getValue())) // filter
        .findFirst() // Optional<ResponseEntry>
        .orElse(null); // or else null
ResponseEntry entry = Stream.ofNullable(serviceResponse.getEntryList()) // Stream<List<ResponseEntry>>
        .flatMap(List::stream) // Stream<ResponseEntry>
        .filter(e -> "expectedValue".equals(e.getValue())) // filter here
        .findFirst() // Optional<ResponseEntry>
        .orElse(null); // or else null
ResponseEntry entry = Optional.ofNullable(serviceResponse.getEntryList())
        .stream() // Stream<List<ResponseEntry>>
        .flatMap(List::stream) // Stream<ResponseEntry>
        .filter(e -> "expectedValue".equals(e.getValue())) // filter here
        .findFirst() // Optional<ResponseEntry>
        .orElse(null); // or else null
Optional<ResponseEntry> entry = Optional.ofNullable(serviceResponse.getEntryList()) // Optional<List<ResponseEntry>>
        .orElseGet(Collections::emptyList) // or else empty List
        .stream() // Stream<ResponseEntry>
        .filter(e -> "expectedValue".equals(e.getValue())) // filter
        .findFirst(); // Optional<ResponseEntry>

if (entry.isEmpty()) { // !entry.isPresent in java-8
   // Do your work here
}
ServiceResponse serviceResponse = service.getServiceResponse();
List<ResponseEntry> list = serviceResponse.getEntryList();

ResponseEntry entry = (list == null ? Collections.emptyList() : list)
    .stream()
    .filter(e -> "expectedValue".equals(e.getValue()))
    .findFirst()
    .orElse(null);

if (entry == null) { ... }
Optional<ResponseEntry> entry = Optional.ofNullable(serviceResponse.getEntryList()).flatMap(list ->
    list.stream().filter(e -> "expectedValue".equals(e.getValue())).findFirst()
);

if (!entry.isPresent()) {
    …
}