我可以使用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;
}
}
答案 0 :(得分:6)
您需要将代表单个值的Optional
转换为Stream
,以完成filter
和findFirst()
操作。在任何空值的情况下,至少有一种方法是映射到空的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