Scala二十四点游戏(11): 从Java中调用Scala函数

jerry Scala 2015年11月25日 收藏

我们对前面定义的计算24的代码,稍作修改,可以在Java中调用,在通常情况下在Java中调用Scala函数非常简单,反之从Scala中调用Java代码也很简单,这是因为Scala代码最终也要编译成Java class文件。以后我们将详细介绍Java和Scala之间的互操作的用法,这里简要介绍下如何在Java代码中调用之前我们定义的计算24的算法。
Scala二十四点游戏(9): 完整的代码和计算结果我们给出了完整的代码,其中的Test由App派生,如果我们希望把Test定义的一些方法如cal24,cal24once 作为库函数调用,我们无需让Test由App派生,另外我们再定义cal24once 的一个重载版本:

  1. object Cal24 {
  2.  
  3. ...
  4. def cal24once(a:Int,b:Int,c:Int,d:Int) {
  5. cal24once(List(a,b,c,d))
  6. }
  7.  
  8. def hello {
  9. println("Hello from Scala")
  10. }
  11.  
  12. }

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

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

  1. Add.class Cal24.class
  2. Add$.class Cal24$.class
  3. BinaryOp.class Cal24.scala
  4. BinaryOp$class.class Divide.class
  5. Bracket$$anonfun$matchBracket$1.class Divide$.class
  6. Bracket$$anonfun$matchBracket$2.class Multiply.class
  7. Bracket.class Multiply$.class
  8. Bracket$.class Rational.class
  9. Cal24$$anonfun$cal24$1$$anonfun$apply$1.class Rational$.class
  10. Cal24$$anonfun$cal24$1.class Subtract.class
  11. Cal24$$anonfun$cal24once$1$$anonfun$apply$2.class Subtract$.class
  12. Cal24$$anonfun$cal24once$1$$anonfun$apply$3.class
  13. Cal24$$anonfun$cal24once$1.class
  14. Cal24$$anonfun$calculate$1.class
  15.  

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

  1. root@ubuntu:/sdb/Scala/Cal24# javap Cal24
  2. Compiled from "Cal24.scala"
  3. public final class Cal24 {
  4. public static void hello();
  5. public static void cal24once(int, int, int, int);
  6. public static void cal24once(scala.collection.immutable.List<java.lang.Object>);
  7. public static void cal24(scala.collection.immutable.List<java.lang.Object>);
  8. public static scala.Tuple3<java.lang.String, java.lang.String, Rational> calculate(java.lang.String, scala.collection.immutable.List<java.lang.Object>);
  9. public static Rational eval(java.lang.String);
  10. public static scala.collection.immutable.List<java.lang.String> templates();
  11. }

可以看到Scala的object (singleton对象)对应到Java的 public final class, Cal24的函数为static
然后我们定义一个TestCal24.java

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

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

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

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

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

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

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