gpt4 book ai didi

Scala 列表、可并行化和从 Java 调用

转载 作者:行者123 更新时间:2023-12-02 14:45:12 25 4
gpt4 key购买 nike

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

在Scala中,我可以将其变成并行集合并调用reduce方法:

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

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

无论如何,这些接口(interface)都没有像#reduce(...)这样的方法。 ,所以他们没有帮助。

我必须做什么才能调用#reduce(...)来自 Java?

干杯,约翰

使用 Scala 2.10 M5 进行 PS

最佳答案

我写了一些 Scala:

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

使用Java反编译器,显然是这样的:

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 中调用 par 之前转换为 Parallelized 会发生什么:

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 我还有很多东西需要学习。

有人知道为什么 Actor 阵容会有所不同吗?

关于Scala 列表、可并行化和从 Java 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com