将 Jsoup Elements.select() 与 Optional.ifPresent 一起使用

Using Jsoup Elements.select() with Optional.ifPresent

初学问题见谅。我正在尝试构建一个网络 scraper 。我做了一个助手 class Selectors 来存储 CSS 不同类型的选择器,并且 class 有一个 getter 方法 returns 一个可选的字段值:

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

在我的主要 Scraper class 中,我有一个方法可以使用 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 class 的好方法。但我正在努力想出一个更好的解决方案。我的第一个想法是使用 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 返回 name/selector,则上面使用建筑物名称元素的文本。和 returns N/A 如果没有。

如果您喜欢更简洁的语法和更少的命名变量,您可以选择以下内容:

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

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