[英]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.