我有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
答案 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。
有谁知道为什么演员会有所作为?