我有这个方法:
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())
}