首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从java.lang.Iterator创建不可变列表

从java.lang.Iterator创建不可变列表
EN

Stack Overflow用户
提问于 2011-05-16 16:40:18
回答 2查看 21.6K关注 0票数 25

我使用一个库(JXPath)来查询bean的图形,以便提取匹配的元素。但是,JXPath将一组匹配的元素作为java.lang.Iterator的实例返回,我更愿意将其转换为不可变的scala列表。有没有比迭代遍历迭代器并在每个迭代步骤创建一个新的不可变列表更简单的方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-16 17:22:29

您可能希望重新考虑对List的需求,尽管在Java语言中使用List非常熟悉,而且List是不可变Seq的默认实现,但它通常不是集合的最佳选择。

list最适合的操作是那些已经通过迭代器可用的操作(基本上是获取连续的head元素和前置元素)。如果迭代器还没有给出你需要的东西,那么我可以保证列表不会是你最好的选择--向量会更合适。

把这事解决了……推荐的在Java和Scala集合之间转换的技术(从Scala2.8.1开始)是通过scala.collection.JavaConverters。这为您提供了比JavaConversions更多的控制权,并避免了一些可能的隐式冲突。

这样就不会有直接的隐式转换。相反,您可以将asScalaasJava方法绑定到集合上,从而允许您显式地执行转换。

要将Java迭代器转换为Scala迭代器:

代码语言:javascript
复制
javaIterator.asScala

要将Java迭代器转换为Scala列表(通过scala迭代器):

代码语言:javascript
复制
javaIterator.asScala.toList

您可能还想考虑转换toSeq而不是toList。在迭代器的情况下,这将返回一个Stream -允许您在更丰富的Seq接口中保留迭代器的懒惰行为。

编辑:没有toVector方法,但是(正如Daniel指出的)有一个toIndexedSeq方法将返回一个Vector作为默认的IndexedSeq子类(就像List是默认的Seq一样)。

代码语言:javascript
复制
javaIterator.asScala.toIndexedSeq
票数 35
EN

Stack Overflow用户

发布于 2011-05-16 16:43:25

Scala:您可能应该看看Kevin Wright's answer,它提供了自Scala2.8.1以来可用的更好的解决方案,具有更少的隐式魔力。

您可以从scala.collection.JavaConversions导入隐式转换,然后无缝地创建一个新的Scala集合,例如:

代码语言:javascript
复制
import collection.JavaConversions._
println(List() ++ javaIterator)

您的Java迭代器被JavaConversions.asScalaIterator转换为Scala迭代器。带有A类型元素的Scala迭代器实现了TraversableOnce[A],这是连接集合和++所需的参数类型。

如果您需要其他集合类型,只需将List()更改为您需要的任何类型(例如,IndexedSeq()collection.mutable.Seq()等)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6014881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档