我有一个Scala对象,我需要在Java类中使用.
这是Scala对象
object Person {
val MALE = "m"
val FEMALE = "f"
}
Run Code Online (Sandbox Code Playgroud)
如何在Java中使用此Scala对象?
到目前为止我没有成功尝试过以下内容(编译错误):
Person.MALE() //返回一个无用的String,因为我想要实际的Person对象这是什么?
public class ABC {
public ABC() {
System.out.println("world");
}
static {
System.out.println("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
将打印:你好世界
我真的不明白这个,或者静态代码是什么样的方法.
我一直在看Spark的文档,它提到了这个:
Spark的API在很大程度上依赖于在驱动程序中传递函数以在集群上运行.有两种建议的方法可以做到这一点:
匿名函数语法,可用于短代码.全局单例对象中的静态方法.例如,您可以定义对象MyFunctions,然后传递MyFunctions.func1,如下所示:
object MyFunctions { def func1(s: String): String = { ... } }
myRdd.map(MyFunctions.func1)
Run Code Online (Sandbox Code Playgroud)
请注意,虽然也可以将引用传递给类实例中的方法(而不是单例对象),但这需要发送包含该类的对象以及方法.例如,考虑:
class MyClass {
def func1(s: String): String = { ... }
def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(func1) }
}
Run Code Online (Sandbox Code Playgroud)
在这里,如果我们创建一个新的MyClass并在其上调用doStuff,那里的map会引用该MyClass实例的func1方法,因此需要将整个对象发送到集群.它类似于写作
rdd.map(x => this.func1(x)).
现在我的疑问是,如果你对单例对象(它应该等同于静态)有属性会发生什么.相同的例子有一个小的改动:
object MyClass {
val value = 1
def func1(s: String): String = { s + value }
}
myRdd.map(MyClass.func1)
Run Code Online (Sandbox Code Playgroud)
所以该函数仍然是静态引用的,但是Spark尝试序列化所有引用的变量会走多远?它会序列化value还是会在远程工作者中再次初始化?
另外,这一切都在我在单例对象中有一些重型模型的上下文中,我想找到将它们序列化到工作者的正确方法,同时保持从单独的单例引用它们的能力,而不是将它们传递给跨深度函数调用堆栈的函数参数.
有关Spark序列化事物的内容/方式/时间的任何深入信息将不胜感激.
Scala对象MODULE $的目的是什么?
以下Scala对象:
object TestScalaObject {
val TEST_SYMBOL = "*"
def testMethod(x : String) : String = x
}
Run Code Online (Sandbox Code Playgroud)
编译成两个字节码文件TestScalaObject.class和TestScalaObject $ .class,如果我反汇编以获得我得到的等效Java代码:
TestScalaObject.class:
public final class TestScalaObject extends java.lang.Object{
public static final java.lang.String testMethod(java.lang.String);
public static final java.lang.String TEST_SYMBOL();
}
Run Code Online (Sandbox Code Playgroud)
TestScalaObject $ .class:
public final class TestScalaObject$ extends java.lang.Object implements scala.ScalaObject{
public static final TestScalaObject$ MODULE$;
public static {};
public java.lang.String TEST_SYMBOL();
public java.lang.String testMethod(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
我可以看到一个public static finalTestScalaObject $ …