Scala.Int在Java变量中存储来自Scala函数的值

时间:2015-08-23 01:08:21

标签: java scala

我有一个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的集合(或迭代器)来获取,以便我可以迭代/排序它们。

enter image description here

3 个答案:

答案 0 :(得分:2)

问题在于Java&#34; foreach&#34;循环仅被编码为处理Java可迭代类型,并且不会将Scala集识别为它可以迭代的东西。您可以尝试自己明确地调用iteratornext等旧样式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());
    }