将 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,所以我没有测试过。如有错字请见谅,并反馈。
初学问题见谅。我正在尝试构建一个网络 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,所以我没有测试过。如有错字请见谅,并反馈。