3

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

在 Scala 中,我可以把它变成一个并行集合并调用 reduce 方法:

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

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

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

我需要做什么才能#reduce(...)从 Java 调用?

干杯,约翰

PS 使用 Scala 2.10 M5

4

1 回答 1

3

我写了一些斯卡拉:

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();

就像 Luigi 写的那样,这导致了一个奇怪的NoSuchMethodException.

我进入了下一个级别,并使用javap -verbose了 ,它给出了这个:

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

这让我想知道如果我在 Java 中Parallelizable调用之前转换为 a 会发生什么: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 的知识。

有谁知道为什么演员阵容会有所不同?

于 2012-07-28T21:44:01.477 回答