如何使用Java8处理可空列表?
我正在打一个服务电话并试图处理回复。 响应可能有一个列表。该列表可能为空 此外,如果列表不为null或不为空,则 它需要过滤。 在代码中,如果过滤不提供任何内容或响应列表为空或null,则“entry”引用可能为null 当前,当我尝试在空响应列表上使用stream()时,我得到了NPE。 我如何处理这种情况如何使用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
@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()) {
…
}