【问题标题】:iterating over Scala collections in Java在 Java 中迭代 Scala 集合
【发布时间】:2010-09-05 23:52:50
【问题描述】:

如何在 Java 中迭代 Scala 集合?

【问题讨论】:

  • 请记住,除非没有人回答您的问题令您满意,否则您应该接受给出的答案之一。
  • 什么?然后向我们展示您的尝试。
  • 当我写 scala.collection.Iterator ite = e.getLastAdd().iterator(); 时,IntelliJIDEA 显示错误:cannot resolve symbol 'Iterator'
  • 请编辑您的问题(或开始一个新问题)以包含您正在使用的代码。此外,请确保您的 Java 编译在类路径中包含 Scala 库。它是 Scala 开发工具包基础目录中的文件 lib/scala-library.jar。

标签: java scala iterator scala-collections


【解决方案1】:

一些例子 Scala

class AThing {
  @scala.reflect.BeanProperty val aList = List(1,2,3,4,99)
}

Java 客户端

public class UseAThing {
  public static void main(String a[]) {
    AThing thing = new AThing();
    scala.collection.Iterator iter = thing.getAList().iterator();
    while (iter.hasNext()) {
      System.out.println(iter.next());
    }
  }
}

输出

jem@Respect:~/c/user/jem$ java -cp /opt/scala/lib/scala-library.jar:. UseAThing
1
2
3
4
99

这有帮助吗?

【讨论】:

  • 有什么方法可以使用 java 1.5 的新 for/in 循环?
【解决方案2】:

从集合中获取一个 Scala Iterator 并使用来自 scala.collection.JavaConversions 的转换将其转换为 Java Iterator。

这是一个例子:

scala> val li1 = List(2, 3, 5, 7, 11)
li1: List[Int] = List(2, 3, 5, 7, 11)

scala> val ii1 = li1.iterator
ii1: Iterator[Int] = non-empty iterator

scala> import collection.JavaConversions._
import collection.JavaConversions._

scala> val ji1: java.util.Iterator[Int] = ii1
ji1: java.util.Iterator[Int] = IteratorWrapper(non-empty iterator)

scala> val ji2 = ii1: java.util.Iterator[Int]
ji2: java.util.Iterator[Int] = IteratorWrapper(non-empty iterator)

在将JavaConversions 导入到任何给定范围后,将有一个隐式转换将任何Scala Iterator[T] 转换为相应的Java Iterator<T>。在前面的示例中,ji1 声明的显式类型触发了对初始化程序 ii1 的隐式转换的应用。在ji2 的情况下,ii1 上的类型归属会触发转换。

【讨论】:

    【解决方案3】:
    for(Item item: JavaConverters.seqAsJavaListConverter(seq).asJava()) {
        // Do thing with item
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2011-04-25
      • 2015-08-17
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多