加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 从java.lang.Iterator创建一个不可变的列表

发布时间:2020-12-16 09:35:53 所属栏目:安全 来源:网络整理
导读:我正在使用一个库( JXPath)来查询bean的图形,以便提取匹配的元素。但是,JXPath返回一组匹配的元素作为java.lang.Iterator的一个实例,我宁愿将其转换成不可变的scala列表。有没有比迭代器迭代更简单的方法,并在每个迭代步骤中创建一个新的不可变列表? 解
我正在使用一个库( JXPath)来查询bean的图形,以便提取匹配的元素。但是,JXPath返回一组匹配的元素作为java.lang.Iterator的一个实例,我宁愿将其转换成不可变的scala列表。有没有比迭代器迭代更简单的方法,并在每个迭代步骤中创建一个新的不可变列表?

解决方法

您可能想要重新考虑对List的需求,尽管在来自Java时感觉非常熟悉,List是不可变Seq的默认实现,它通常不是最佳选择。

列表最佳的操作是通过迭代器可以使用的操作(基本上采用连续的头元素和前置元素)。如果一个迭代器没有给你你需要的,那么我几乎可以保证一个列表不会是你最好的选择 – 一个向量将是更合适的。

有了这样的方式…推荐的技术转换Java和Scala集合(自Scala 2.8.1以来)通过scala.collection.JavaConverters.这比JavaConversions更多的控制,并避免一些可能的隐含冲突。

你不会这样直接隐式转换。相反,您将asScala和asJava方法映射到集合上,允许您显式执行转换。

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

javaIterator.asScala

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

javaIterator.asScala.toList

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

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

javaIterator.asScala.toIndexedSeq

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读