我有一个Scala集合history
,如下所示:
import scala.collection.mutable.{Map => mm, Set => mSet}
private var history: mm[Int, mSet[String]] = mm[Int, mSet[String]]()
并且getHistory()
Scala函数会将history
返回到mm[Int, mSet[String]]
类型。这是存储history
的返回值的Java代码。
import scala.collection.mutable.Map;
import scala.collection.mutable.Set;
??? history = Database.getHistory();
问题是只有Map<Object, Set<String>>
不会导致错误。我尝试使用Map<Integer, ...>
和Map<scala.Int, ...>
,但没有任何效果。
为什么会出现这个错误? 我需要将键作为Integers的集合(或迭代器)来获取,以便我可以迭代/排序它们。
答案 0 :(得分:2)
问题在于Java&#34; foreach&#34;循环仅被编码为处理Java可迭代类型,并且不会将Scala集识别为它可以迭代的东西。您可以尝试自己明确地调用iterator
,next
等旧样式for循环,或者首先将集合转换为Java等效(尽管可能更容易在Scala代码中完成)。
答案 1 :(得分:1)
这是a thing。
如前所述,Scala中的Coercing工作正常:
import scala.collection.JavaConverters._
private var history: mm[Int, mSet[String]] = mm[Int, mSet[String]]()
history += ((42, mSet("hi")))
def getMystery(): java.util.Map[Int, mSet[String]] = history.asJava
def getHistory() = history.asJava.asInstanceOf[java.util.Map[Integer, mSet[String]]]
答案 2 :(得分:0)
JavaConversion
可以将keySet()转换为iterables。
Map<Object, Set<String>> history = Database.getHistory();
Iterable<Object> keys = JavaConversions.asJavaIterable(history.keySet());
for (Object key : keys) {
int k = (int)key;
System.out.printf("%d-%s\n", k, history.get(k).get().toString());
}
对于Int问题,我可以在scala代码中将scala.Int更改为java.Integer,但是Object似乎工作正常。
对于排序键,从Fastest way to get a sorted array out of an Iterable of integers的提示中,我可以填充键。
List<Integer> sortedList = new ArrayList<>();
for (Object i : keys) {
sortedList.add((int)i);
}
Collections.sort(sortedList);
for (int key : sortedList) {
System.out.printf("%d-%s\n", key, history.get(key).get().toString());
}