如果从 List 返回时元素可能不存在,如何处理 null<>方法



我有这个方法:

public static List<PointElement> retrievePoints(
FullResponse responseWrapper) {
List<PointElement> pointsList =
responseWrapper.getFullBreakdownResult().getPoints();
return pointsList.stream()
.map(
point ->
new PointElement(
null,
null,
point.getRefNum(),
point.getPointCode()))
.collect(Collectors.toList());
}
}

pointsList可能是一个空值。目前,如果是这种情况,我在return上得到一个NullPointerException

我想也许我可以把它改成:

public static Optional<List<PointElement>> retrievePoints(
FullResponse responseWrapper) {
Optional<List<PointElement>> pointsList =
responseWrapper.getFullBreakdownResult().getPoints();
return pointsList.stream()
.map(
point ->
new PointElement(
null,
null,
point.getRefNum(),
point.getPointCode()))
.collect(Collectors.toList());
}
}

这会导致方法point.getRefNum()point.getPointCode()中的其他问题无法解决吗?

如何解决此问题?

Optional<Collection<T>>通常不受欢迎。而是返回一个空集合。

public static List<PointElement> retrievePoints(
FullResponse responseWrapper) {
List<PointElement> pointsList =
responseWrapper.getFullBreakdownResult().getPoints();
if (pointsList == null) return Collections.emptyList();
return pointsList.stream()
.map(
point ->
new PointElement(
null,
null,
point.getRefNum(),
point.getPointCode()))
.collect(Collectors.toList());
}
}

可能需要过滤流中的数据,使用filter非常适合这种情况。

public static List<PointElement> retrievePoint(FullResponse responseWrapper){
List<PointElement> pointsList = responseWrapper.getFullBreakdownResult().getPoints();
if(pointsList == null)return Collections.emptyList();
return pointsList.stream().filter(point -> points!=null).map(point ->newPointElement(null,null,point.getRefNum(),point.getPointCode())).collections(Collectors.toList());
}

如果您更喜欢使用java.util中的Objects来验证Object是否为null,例如:

if(Objects.isNull(pointsList)) return Collections.emptyList();

你可以在流中使用,比如:

return list.stream().filter(e-> Objects.nonNull(e)).collect(Collectors.toList());

return list.stream().filter(Objects::nonNull).collect(Collectors.toList());

正如@knittl在他的回答中指出的那样,用Optional包装Collection是没有意义的。

Optional被设计为一个可为null的数据容器,无论它是否包含值,您都可以安全地与容器交互。但是集合和数组本质上也是数据容器,它们可以通过为空来表示没有数据,并且可以在没有任何问题的情况下进行验证。

因此,List将足够作为返回值。

由于您没有将responseWrapper.getFullBreakdownResult().getPoints()不返回数据的情况视为正常事件,也不会抛出异常或记录此信息,因此可以使用Java 9方法Stream.ofNullable()从可为null的源生成流管道。

public static List<PointElement> retrievePoints(FullResponse responseWrapper) {

return Stream.ofNullable(responseWrapper.getFullBreakdownResult().getPoints())
.flatMap(Collection::stream)
.map(point ->
new PointElement(
null,
null,
point.getRefNum(),
point.getPointCode())
)
.toList(); // for Java 16 or collect(Collectors.toList())
}

相关内容

  • 没有找到相关文章

最新更新