我使用一个库(JXPath)来查询bean的图形,以便提取匹配的元素。但是,JXPath将一组匹配的元素作为java.lang.Iterator的实例返回,我更愿意将其转换为不可变的scala列表。有没有比迭代遍历迭代器并在每个迭代步骤创建一个新的不可变列表更简单的方法呢?
发布于 2011-05-16 17:22:29
您可能希望重新考虑对List
的需求,尽管在Java语言中使用List非常熟悉,而且List是不可变Seq
的默认实现,但它通常不是集合的最佳选择。
list最适合的操作是那些已经通过迭代器可用的操作(基本上是获取连续的head元素和前置元素)。如果迭代器还没有给出你需要的东西,那么我可以保证列表不会是你最好的选择--向量会更合适。
把这事解决了……推荐的在Java和Scala集合之间转换的技术(从Scala2.8.1开始)是通过scala.collection.JavaConverters
。这为您提供了比JavaConversions
更多的控制权,并避免了一些可能的隐式冲突。
这样就不会有直接的隐式转换。相反,您可以将asScala
和asJava
方法绑定到集合上,从而允许您显式地执行转换。
要将Java迭代器转换为Scala迭代器:
javaIterator.asScala
要将Java迭代器转换为Scala列表(通过scala迭代器):
javaIterator.asScala.toList
您可能还想考虑转换toSeq
而不是toList
。在迭代器的情况下,这将返回一个Stream
-允许您在更丰富的Seq
接口中保留迭代器的懒惰行为。
编辑:没有toVector
方法,但是(正如Daniel指出的)有一个toIndexedSeq
方法将返回一个Vector
作为默认的IndexedSeq
子类(就像List
是默认的Seq
一样)。
javaIterator.asScala.toIndexedSeq
发布于 2011-05-16 16:43:25
Scala:您可能应该看看Kevin Wright's answer,它提供了自Scala2.8.1以来可用的更好的解决方案,具有更少的隐式魔力。
您可以从scala.collection.JavaConversions
导入隐式转换,然后无缝地创建一个新的Scala集合,例如:
import collection.JavaConversions._
println(List() ++ javaIterator)
您的Java迭代器被JavaConversions.asScalaIterator
转换为Scala迭代器。带有A
类型元素的Scala迭代器实现了TraversableOnce[A]
,这是连接集合和++
所需的参数类型。
如果您需要其他集合类型,只需将List()
更改为您需要的任何类型(例如,IndexedSeq()
或collection.mutable.Seq()
等)。
https://stackoverflow.com/questions/6014881
复制相似问题