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から呼び出すことができるようにするには、何をする必要がありますか?

乾杯、ジョン

Scala2.10M5を使用したPS

4

1 に答える 1

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;

そのため、JavaParallelizableで呼び出す前ににキャストするとどうなるのだろうかと思いました。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 に答える