在scala.collection,有两个非常相似的对象JavaConversions和JavaConverters.
我有一个返回List的Java API,如:
public List<?> getByXPath(String xpathExpr)
Run Code Online (Sandbox Code Playgroud)
我使用下面的scala代码:
val lst = node.getByXPath(xpath)
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试scala语法糖,如:
lst.foreach{ node => ... }
Run Code Online (Sandbox Code Playgroud)
这是行不通的.我收到错误:
value foreach is not a member of java.util.List[?0]
Run Code Online (Sandbox Code Playgroud)
看来我需要将Java List转换为Scala List.如何在上述背景下做到这一点?
我需要在Java中实现一个返回"Seq"的方法但是我遇到错误,我不知道如何解决它.
java.util.ArrayList cannot be cast to scala.collection.Seq
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的代码
@Override
public Seq<String> columnNames() {
List<String> a = new ArrayList<String>();
a.add("john");
a.add("mary");
Seq<String> b = (scala.collection.Seq<String>) a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
Seq似乎没有提供转换为的可能性scala.collection.JavaConverters.谢谢
什么是Java 的等效Scala构造函数(用于创建不可变的 HashSet)
new HashSet<T>(c)
Run Code Online (Sandbox Code Playgroud)
这里c是类型的Collection<? extends T>?
我在HashSet 物体中找到的只是apply.
将Java Collection转换为Scala等效项的最简单方法是使用JavaConversions,因为Scala 2.8..这些隐式defs返回包含的Java Collection的包装器.
Scala 2.9引入了并行集合,可以并行执行集合上的操作,稍后收集结果.这很容易实现,将现有集合转换为并行集合非常简单:
myCollection.par
Run Code Online (Sandbox Code Playgroud)
但是使用JavaConversions从Java集合转换的集合上使用'par'会有问题.如并行收集转换中所述,通过评估所有值并将它们添加到新的并行集合,本质上将顺序集合"强制"为新的并行集合:
其他集合(例如列表,队列或流)本质上是顺序的,因为必须一个接一个地访问元素.通过将元素复制到类似的并行集合中,可以将这些集合转换为其并行变体.例如,功能列表被转换为标准的不可变并行序列,其是并行向量.
当原始Java集合要进行延迟评估时,这会导致问题.例如,如果仅返回Java Iterable,稍后将其转换为Scala Iterable,则无法保证Iterable的内容是否会被急切访问.那么如何从Java集合中创建并行集合而不必承担评估每个元素的成本呢?我试图通过使用并行集合并行执行它来避免这种成本,并希望"获取"提供的前n个结果.
根据Parallel Collection Conversions,有一系列的收集类型需要花费不变的时间,但似乎没有办法确保JavaConversions可以创建这些类型(例如,'Set'可以创建,但是那个'HashSet'?).