我正在进行服务调用,并试图处理响应。响应可能有一个列表的东西。该列表可能是空的。
此外,如果列表不为空,那么它需要被过滤。在代码中,如果过滤没有结果或者响应列表为空,那么“entry”引用可能为空。
目前,当我试图在一个空响应列表上使用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) { ... }
6条答案
按热度按时间llycmphe1#
Stream.ofNullable
(Java-9)返回包含单个元素的顺序Stream, 如果非null , 否则 * 返回空Stream*。
当前代码
更新代码
Optional.stream
(Java-9)返回仅包含该值的顺序 Stream, 否则 * 返回空Stream**。
Optional.isEmpty
(Java-11)如果值 * 不存在 ,则返回true*,* 否则返回***false***
o2gm4chl2#
如果list不为null或不为空,则需要对其进行过滤。
这里不需要Optional,因为它不打算替换简单的
if
检查。responseEntries
不为空且responseEntries
不为空,则应用过滤操作并找到第一项,否则为空”。可读性很强。另一方面,任择办法:
lrl1mhuk3#
在Java 9中,您可以使用新方法
Objects.requireNonNullElse(T,T)
:Apache Commons Collections实际上有一个方法
ListUtils.emptyIfNull(List<T>)
,如果参数列表是null
,它会返回一个空列表,这更好,但是Objects.requireNonNullElse
是Java SE中最接近它的东西。如果您只限于Java8,那么我同意Aomine的回答,即尝试执行
Optional
之类的操作比if
语句更糟糕。xfyts7mz4#
您可以简单地使用三元运算符:
有时候,传统的更好海事组织。
cunj1qz15#
另一种选择是使用
Optional
单子:如果您的目标是构建(并返回)一个值,而不是执行副作用,您甚至可以使用
orElseGet
来代替if
语句。ql3eal8s6#
我是新的可选,我可能是错误的。逻辑可以写如下,如果你想有逻辑只包括可选的。