在scala中迭代java.util.set并创建新的java.util.hashset

时间:2014-02-03 14:23:46

标签: scala scala-java-interop

我有java API返回java.util.set,我想迭代set直到size-1并在scala中创建新的java.util.hashset

我试过以下:

val keys = CalltoJavaAPI()
val newHashSet = new java.util.HashSet()
val size = keys.size();
newHashSet.add(keys.take(keys.size() - 1))

但我收到以下错误:

Caused by: java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:221)

尝试过以下但仍无法正常工作

    val keys = CalltoJavaAPI().asScala        
    var newHashSet = new scala.collection.mutable.HashSet[Any]()
    newHashSet.add(keys.take(keys.size - 1))

2 个答案:

答案 0 :(得分:2)

使用scala.collection.JavaConversions进行Scala和Java集合之间的隐式转换。

在以下方法中,我们将Java HashSet转换为Scala Set,提取感兴趣的键,并将结果转换为新的Java HashSet

import scala.collection.JavaConversions._

val javaKeys = new java.util.HashSet[Any](CalltoJavaAPI()) 
val n = javaKeys.size 

val scalaSet = javaKeys.toSet.take(n-1)

val newJavaHashSet = new java.util.HashSet[Any]()
newJavaHashSet.addAll(scalaSet)

答案 1 :(得分:0)

我认为您应该使用newHashSet.addAll(...)代替newHashSet.add(...),因为keys.take(...)会返回List

来自docs

  

public boolean add(E e):如果指定的元素尚不存在,则将其添加到该集合中。

     

public boolean addAll(Collection c):将指定集合中的所有元素添加到此集合中