gpt4 book ai didi

java - Scala 不会在循环内将 Element 转换为产生值

转载 作者:行者123 更新时间:2023-12-01 17:58:12 25 4
gpt4 key购买 nike

我对 Scala 还很陌生。我有这个方法来过滤来自 Jsoup 库的所有以给定 namespace 开头的元素。

def getElementsByNamespace(element: org.jsoup.nodes.Element, namespace: String) : org.jsoup.select.Elements = {
val elements =
for {
el <- element.select("*")
if el.tagName().startWith(namespace+":")
} yield el
elements
}

在此示例中<root><server:cpu></server:cpu><server:ram></server:ram><a></a></root>该方法将获取以 server 开头的所有元素

问题是 scala 正在强制转换 el <- element.select("*")Any而不是Element这是 select 方法返回的类型(它实际上返回一个 Elements 对象或一个 ArrayList)

因此,当我调用if el.tagName().startWith(namespace+":")时找不到 tagName(),因此代码无法编译。

我尝试过filter、withFilter等,但仍然不起作用。

为什么会发生这种情况?我怎样才能让这段代码变得更好?

最佳答案

简短回答(tl;dr)

问题是您需要在 Scala 和 Java 集合之间进行转换:

def getElementsByNamespace(element: org.jsoup.nodes.Element, namespace: String): org.jsoup.select.Elements = {
import collection.JavaConverters._
val elements = for {
el <- element.select("*").asScala
if el.tagName().startsWith(s"$namespace:")
} yield el
new Elements(elements.asJava)
}

说明

为了在 Scala 中迭代集合,您可以使用 flatMapmap 或进行推导式。没有其他方法(如 Java 中的 forforeach 循环)。

但问题是 Java 集合不被直接支持,因为它们需要在其上定义一个 flatMap 方法。 flatMap 的本质是迭代(另外两个方法也是基于flatMap定义的)。

这就是为什么你需要将 Elements 类型的变量转换为 Scala 集合(导入 JavaConverters._ 并调用 asScala 方法) Java 集合)。

最后,您需要构造一个新的 Elements 但该类的构造函数,可以理解,只接受 Java 集合,因此您需要转换 for 理解的结果,这是一个 Scala集合,到 Java 集合。

关于java - Scala 不会在循环内将 Element 转换为产生值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com