Skip to content
This repository was archived by the owner on May 8, 2019. It is now read-only.

Latest commit

 

History

History
129 lines (89 loc) · 5.35 KB

5.在Java中调用Scala函数.md

File metadata and controls

129 lines (89 loc) · 5.35 KB

#在Java中调用Scala函数

一、实验简介

你知道吗?我们对前面定义的计算24的代码,稍作修改后,可以在Java中调用。本节实验我们就将为你介绍如何调用。

本节实验具有一定难度,推荐具有Java编程基础的同学作深入了解。

准备工作

为了使用交互式Scala解释器,你可以在打开的终端中输入命令:

cd /usr/local/scala-2.11.7/bin/

scala

当出现scala>开始的命令行提示符时,就说明你已经成功进入解释器了。如下图所示。

二、在Java代码中调用Scala函数

在通常情况下,在Java中调用Scala函数非常简单;反之,从Scala中调用Java代码也很简单。这是因为,Scala代码最终也要编译成Java class文件。以后我们将详细介绍Java和Scala之间的互操作的用法,这里简要介绍下如何在Java代码中调用之前我们定义的计算24的算法。

编者注:实验楼为你提供了Eclipse作为Java的开发环境,请根据实际需要决定是否使用(如果仅需编辑代码,可以只用Sublime Text)。

在上一个实验中,我们给出了完整的代码。其中的TestApp派生。如果我们希望把Test定义的一些方法如cal24cal24once 作为库函数调用,我们无需让TestApp派生,只需要另外再定义 cal24once 的一个重载版本:

object Cal24 {

   ...
   def cal24once(a:Int,b:Int,c:Int,d:Int) {
   cal24once(List(a,b,c,d))
  }

  def hello {
    println("Hello from Scala")
  }

}

我们把这段代码存成Cal24.scala。 下面我们使用scalac 对它进行编译:

scalac Cal24.scala

然后我们列出由 scalac 编译后生成的 class 文件:

编者注:class文件所处的文件目录是取决于你执行上一个scalac编译命令时指定的。请同学们注意组织好源文件和类文件的存放位置。

Add.class                                          Cal24.class
Add$.class                                         Cal24$.class
BinaryOp.class                                     Cal24.scala
BinaryOp$class.class                               Divide.class
Bracket$$anonfun$matchBracket$1.class              Divide$.class
Bracket$$anonfun$matchBracket$2.class              Multiply.class
Bracket.class                                      Multiply$.class
Bracket$.class                                     Rational.class
Cal24$$anonfun$cal24$1$$anonfun$apply$1.class      Rational$.class
Cal24$$anonfun$cal24$1.class                       Subtract.class
Cal24$$anonfun$cal24once$1$$anonfun$apply$2.class  Subtract$.class
Cal24$$anonfun$cal24once$1$$anonfun$apply$3.class  
Cal24$$anonfun$cal24once$1.class                   
Cal24$$anonfun$calculate$1.class

其中 Cal24 定义了我们所需的库函数,我们可以使用javap 看看它对应的java类定义:

编者注:下面的命令中,路径~/Desktop/Scala/Cal24需要修改为你存放项目文件的实际位置。

root@shiyanlou:~/Desktop/Scala/Cal24# javap Cal24
Compiled from "Cal24.scala"
public final class Cal24 {
  public static void hello();
  public static void cal24once(int, int, int, int);
  public static void cal24once(scala.collection.immutable.List<java.lang.Object>);
  public static void cal24(scala.collection.immutable.List<java.lang.Object>);
  public static scala.Tuple3<java.lang.String, java.lang.String, Rational> calculate(java.lang.String, scala.collection.immutable.List<java.lang.Object>);
  public static Rational eval(java.lang.String);
  public static scala.collection.immutable.List<java.lang.String> templates();
}

可以看到,Scala的object (singleton对象)对应于Java的 public final classCal24的函数为static

然后我们定义一个TestCal24.java

public class TestCal24{
    public static void main(String[] args) {
        Cal24.cal24once(5,2,3,4);
    }
}

然后我们使用javac来编译TestCal24.java。此时,我们需要指明scala库的位置。

编者注:$SCALA_HOME为配置好的系统环境变量。如果你没有配置该项,你可以使用/usr/local/scala-2.11.7代替$SCALA_HOME。另外,你还需要根据自己的项目实际情况,指明TestCal24.java的具体路径,例如~/Desktop/Scala/TextCal24.java

javac -cp $SCALA_HOME/lib/scala-library.jar:. TestCal24.java

-cp (class path) 指明Scala类定义的路径。

然后运行编译后的 TestCal24 代码:

编者注:同理,此命令中的$SCALA_HOMETestCal24也需要根据你的实际情况,决定是否修改。

root@shiyanlou:~/Desktop/Scala/Cal24# java -cp $SCALA_HOME/lib/scala-library.jar:. TestCal24
List(5, 2, 3, 4):(N-(N-N))*N:(5-(2-3))*4

调用成功,这样你可以在Java应用(包括Android应用)中使用Scala的函数库。

三、实验总结

本节我们学习了如何在Java代码中调用Scala函数。完成了本实验的学习后,今后无论是在Spark上使用Scala,还是将其用作其他用途,相信你都对这门语言有了更加深入的认识。我们将继续开设更多的Scala课程,以满足你的学习需求。

在学习过程中有任何问题和建议,都欢迎你通过实验楼的问答版块与我们交流!