代码之家  ›  专栏  ›  技术社区  ›  druid1123

使用Java可选。有效的不可逆性

  •  3
  • druid1123  · 技术社区  · 7 年前

    我可以使用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();
    

    我无法在一条线上实现这一点。我试着做平面图,但效果不太好。请告知我们是否可以在一条线上实现这一点。

    以下是完整的模式供参考

    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 回复  |  直到 7 年前
        1
  •  6
  •   Kayaman    7 年前

    您需要从转换 Optional 表示单个值 Stream filter findFirst() 操作。至少有一种方法是映射到空 流动 (或空 List 如相邻答案中所示)对于任何空值:

    Optional.ofNullable(request)
        .map(Request::getBody)
        .map(Body::getSections)
        .map(List::stream)
        .orElse(Stream.empty())
        .filter(section -> "name".equals(section.getName))
        .findFirst();
    
        2
  •  3
  •   Alex Saunin    7 年前

    这应该适合您:

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