4

是否可以编写这样的内容并避免检查元素是否为空且集合是否为空:

 response.getBody()
    .getRequestInformation()
    .getRequestParameters().get(0)
    .getProductInstances().get(0)
    .getResultParameters()

我发现了类似的东西 http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/

基本上,我想要实现的是避免具有多个检查天气对象的语句为空或层次结构中的集合为空。我在上面的帖子中读到,这可以通过可选的“在后台自动处理空检查”来实现。

如果已经有一些解决方案,抱歉重复,请参考。

4

1 回答 1

7

如果你想链接Optional,你可以使用它的map(Function<? super T,? extends U> mapper)方法来调用映射器函数,如果它不是null,你可以使用它flatMap(Stream::findFirst)来获取你的第一个元素Collection作为下一个:

Optional<List<ResultParameterClass>> parameters = Optional.ofNullable(response)
    .map(ResponseClass::getBody)
    .map(BodyClass::getRequestInformation)
    .map(RequestInformationClass::getRequestParameters)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(RequestParameterClass::getProductInstances)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(ProductInstanceClass::getResultParameters);

如果列表中存在,是否可以返回列表Optional,或者如果不存在则返回类似 new 的 内容ArrayList<ResultParameterClass>()

是的,您只需要使用orElseGet(Supplier<? extends T> other)ororElse(T other)提供一个默认值,结果将不再是 aOptional而是 a List<ResultParameterClass>

所以代码将是:

List<ResultParameterClass> parameters = Optional.ofNullable(response)
    ...
    .map(ProductInstanceClass::getResultParameters)
    .orElseGet(ArrayList::new);
于 2016-11-07T15:44:42.730 回答