繁体   English   中英

使用 Jsoup Elements.select() 和 Optional.ifPresent

[英]Using Jsoup Elements.select() with Optional.ifPresent

请原谅我的初学者问题。 我正在尝试构建一个网络爬虫 我创建了一个辅助类Selectors来存储不同类型的 CSS 选择器,并且该类有一个返回可选字段值的 getter 方法:

public Optional<String> getName() {
    return Optional.ofNullable(this.name);
}

在我的主要Scraper类中,我有一个方法可以使用Selectors对象从 HTML 中提取名称,如下所示:

public String extractName(Element building) {
    if (this.selectors.getName().isPresent()) {
        String cssSelector = this.selectors.getName().get();
        Elements buildingNameElement = building.select(cssSelector);
        return buildingNameElement.text();
    }
    return "N/A";
}

据我所知,这并不是使用Optional类的好方法。 但我正在努力想出一个更好的解决方案。 我的第一个想法是使用ifPresent方法,但它不能以这种方式工作:

public String extractName(Element building) {
    this.selectors.getName().ifPresent(() -> {
        String cssSelector = this.selectors.getName().get();
        Elements buildingNameElement = building.select(cssSelector);
        return buildingNameElement.text();
    });
    return "N/A";
}    

我希望Elements.select()只有在Selectors对象中存在名称字段时才会执行。 谁能帮我让代码更实用一点?

谢谢!

public String extractName(Element building) {
     return this.selectors
             .getName()
             .map(cssSelector -> {
                        Elements buildingNameElement = building.select(cssSelector);
                        return buildingNameElement.text();
                    })
             .orElse("N/A");
}  

这就是Optional.map的用途。 当您确实在 lambda 内部return ,您只是从 lambda 返回,而不是从外部方法返回。 因此,如果getName返回名称/选择器,则上面使用建筑物名称元素的文本。 如果不是,则返回N/A

如果您对更简洁的语法和更少的命名变量感到满意,则可以使用以下方法:

     return this.selectors
             .getName()
             .map(cssSelector -> building.select(cssSelector).text())
             .orElse("N/A");

免责声明:我的电脑上没有 JSoup,所以我没有测试。 如有错别字请见谅,并反馈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM