有效地使用Java Optional.ofNullable

时间:2017-10-11 07:05:55

标签: java java-8 optional

我可以使用Java8提取特定部分,如下所示

request.getBody()
       .getSections()
       .filter(section -> "name".equals(section.getName))
       .findFirst();

但如何在单行中使用可选项执行相同操作。我的身体或部分可能为空。

我尝试过以下但不能正常工作

Optional.ofNullable(request)
        .map(Request::getBody)
        .map(Body::getSections)
        .filter(section -> "name".equals(section.getName)) //compliation error. section is coming as a list here
        .findFirst();

我无法让这一切工作在一条线上。我试过做flatMap但不能正常工作。请告知我们是否可以在单线上实现这一目标。

以下是完整的参考架构

class Request {
    Body body;

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body = body;
    }

}

class Body {
    List<Section> sections;

    public List<Section> getSections() {
        return sections;
    }

    public void setSections(List<Section> sections) {
        this.sections = sections;
    }

}

class Section {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

2 个答案:

答案 0 :(得分:6)

您需要将代表单个值的Optional转换为Stream,以完成filterfindFirst()操作。在任何空值的情况下,至少有一种方法是映射到空的Stream(或空的List,就像在相邻的答案中一样):

Optional.ofNullable(request)
    .map(Request::getBody)
    .map(Body::getSections)
    .map(List::stream)
    .orElse(Stream.empty())
    .filter(section -> "name".equals(section.getName))
    .findFirst();

答案 1 :(得分:3)

这应该适合你:

this