Scala List,可并行化并从Java调用

时间:2012-07-27 15:50:26

标签: scala scala-collections

我有scala.collection.immutable.List[WeatherData]

在Scala中,我可以将其转换为并行集合并调用reduce方法:

val sum = myList.par.reduce(_+_)

我想在Java中做同样的事情,但我不能。首先,Eclipse告诉我#par()的签名返回一个ParSeq [WeatherData],但如果我要求Eclipse将结果赋给局部变量,它会给我一个scala.collection.parallel.ParIterable<WeatherData>

无论哪种方式,这些接口都没有类似#reduce(...)的方法,所以它们没有帮助。

我该怎么办,以便我可以从Java调用#reduce(...)

干杯, 约翰

PS使用Scala 2.10 M5

1 个答案:

答案 0 :(得分:3)

我写了一些Scala:

val data = List(1,2,3)
val par = data.par
val result = par.reduce(_+_)
println(result)

使用Java Decompiler,显然是这样的:

List localList = List..MODULE$.apply(Predef..MODULE$.wrapIntArray(new int[] { 1, 2, 3 }));
ParSeq localParSeq = (ParSeq)localList.par();

稍微纠正一下,我尝试了这个Java:

List localList = List$.MODULE$.apply(Predef$.MODULE$.wrapRefArray(new Integer[] { 1, 2, 3 }));
ParSeq localParSeq = (ParSeq)localList.par();

和路易吉写的一样,这导致了一个奇怪的NoSuchMethodException

我进入了下一个级别,并使用了javap -verbose,这就是:

29: invokeinterface #40,  1; //InterfaceMethod scala/collection/Parallelizable.par:()Lscala/collection/Parallel;

这让我想知道如果我在Java中调用Parallelizable之前转换为par会发生什么:

List localList = List$.MODULE$.apply(Predef$.MODULE$.wrapRefArray(new Integer[] { 1, 2, 3 }));
Parallelizable p = (Parallelizable)localList;       
Parallel p2 = p.par();
Integer result = (Integer) ((ParSeq)p2).reduce(adder);
System.out.println(result);

打印6,这是正确的: - )

但我必须承认,我不知道为什么我必须施展。这让我意识到我还有很多东西需要学习Java和Scala。

有谁知道为什么演员会有所作为?