`

Java使用Scala代码

 
阅读更多

2012-04-13 

    众所周知,Scala可以使用Java编写的所有类和方法。这是Scala的一个非常重大的优点。由于Scala编写的代码最终也会编译成.class文件,因此理论上Java也可以使用Scala的编写的类和方法。但是因为Scala拥有Java所没有的一些特质,并且在实际编译器处理之后会出现独特的变化,所以Java直接使用Scala编写出来的东西会需要一点额外工作。

       1. 变量

        我们定义一个简单的Scala类。

 class AClass {                                  
                        val a: Int =1                                
                        var b: String ="abc"                  
 }      

 

 编译成class文件之后,我们用javap命令查看,如图1所示:


图1 编译后的scala类

       我们发现变量消失了,而且还多了几个方法。那我们应该怎么对类里的变量赋值呢?其实很简单,可以赋值的var变量会生成一个新的方法。其命名规则是:void 变量名_$eq(变量类型  参数)。这个就是赋值的方法。而取值的方法就是与变量名同名的函数了(本例的a()和b())。简而言之,scala编译器为我们自动生成了getter和setter。

 

       2. Option类

        有时候我们会用到Option打包的对象比如Option[Int]的Some(1)。在Scala中我们可以Some(1)来表示,但如果在Java中我们就不能这样了。本质上Some(1)其实调用的是Option.apply()方法。因此,我们只要使用scala.Option.apply(1)就能得到Some(1)的效果。同样的道理,我们也可以Option.apply("abc")得到Some("abc")的效果。

       不过,有一点需要注意的是Option.apply(new Integer(1))可是不能通过编译的。因为Scala并不能将java.lang.Integer直接转化成Int。

 

     3. 参数是函数

        Scala是第一类函数语言,对于Scala而言,任何东西都有值,即便是函数也能作为变量进行传递。

 

        我们又定义一个类:

class BClass {
              def method(i:Int)(param: =>Double)={
                     val value = param
                     println(i+":"+value)
               }
}

 

 编译成class文件之后,我们用javap命令查看,如图2所示:


图2 BClass转成class的实现

       我们可以看到不带参数的函数参数param被转化成了一个scala.Function0类型的参数。因此,如果我们要使用BClass的method方法,我们只要把一个Fucntion0类型的参数传递进去即可。

      本例的解决方法:

 scala.Function0<Double> func = new scala.runtime.AbstractFunction0<Double>(){
            public Double apply(){

                //此处写你的具体实现吧
                double d = 2.2d;
                return new Double(d);

            }
        };

     BClass bClass = new BClass();

     bClass.method(1, func);

       在Scala中,作为参数的函数会变成FunctionN类型的对象(N是该函数的参数个数),具体更高级的应用请参考scala的API。

 

    4. 心得

     以上的方法其实不是很好玩,而且看上去代码易读性很差。如果非要用Scala的代码,不如多写几个能利于Java直接调用的封装类,而让Java直接调用这些封装类。是叫适配器设计模式(Adapter Pattern)吗?

 

  • 大小: 11.9 KB
  • 大小: 13.7 KB
分享到:
评论

相关推荐

    scala-to-java:将Scala代码转换为Java代码的命令行工具

    从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 在目标目录中scala-to-java.jar将创建scala-to-java.jar 使用java...

    scala和java混合编译

    例如,避免在Scala代码中使用Java的可变集合,因为这可能导致类型不匹配的问题。同样,当Java代码调用Scala代码时,需确保导入正确的Scala类和对象。 测试方面,你可以使用JUnit(Java测试框架)和ScalaTest(Scala...

    SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)

    这种混编允许开发团队在已有的Java项目中逐渐引入Scala代码,以利用其优势,同时保持与现有Java代码的兼容性。在实际应用中,可能会在服务端逻辑或者特定组件上使用Scala,而其他部分仍然使用Java,这样可以逐步过渡...

    scala学习源代码

    首先,Scala运行在Java虚拟机(JVM)上,这意味着它可以无缝地与Java库集成,同时也享受到了JVM的高性能和跨平台兼容性。它的语法设计简洁而富有表达力,使得代码更加易读和易维护。 在面向对象编程方面,Scala支持...

    基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip

    基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于...

    基于maven的scala与java相互调用的简单实例

    通过Maven,我们可以轻松地在Java项目中引入Scala代码,反之亦然。 首先,要实现Java和Scala的互调用,我们需要在`pom.xml`文件中配置Maven。确保`maven-compiler-plugin`和`scala-maven-plugin`已添加并正确配置。...

    scala java相关开发工具

    在Scala环境中,开发者经常使用IntelliJ IDEA或Scala IDE这样的集成开发环境(IDE),它们提供了对Scala语法的智能提示、代码调试和重构等功能。对于Java开发者来说,这些工具也支持Java项目,使得在两个语言间切换...

    面向Java开发人员的Scala指南

    为了更好地从Java过渡到Scala,开发者需要了解这些核心概念并实践编写Scala代码。《面向Java开发人员的Scala指南》这本书将深入讲解这些主题,并通过实例帮助读者理解和应用。阅读本书,Java开发者不仅可以学习到...

    基于Java、Scala和Spark的数据处理与分析设计源码

    本资源提供了一套基于Java、Scala和Spark的数据处理与分析设计源码,包含1381个文件,其中包括634个CRC文件,316个BK文件,35个Class字节码文件,20个XML配置文件,15个Java源代码文件,13个JAR打包文件,8个...

    java-to-scala-plugin:用于将 Java 转换为 Scala 的 Scala IDE 插件

    要使用它,请右键单击任何 Java 类、包或源文件夹,然后选择“转换为 Scala” 您还可以将 Java 代码复制到剪贴板,打开 Scala 编辑器,然后按 Ctrl+Shift+V(或右键单击并选择“粘贴(将 Java 转换为 Scala)”)...

    在Jelastic上使用Scala编程Java开发Java

    由于Scala可以无缝集成到Java生态系统中,开发者可以在一个项目中同时使用两种语言,利用Scala的高级特性增强Java代码。 **经验技巧** 五页的PDF文档可能涵盖了以下几点: 1. **环境配置**:如何在Jelastic平台上...

    scala-java8-compat_2.11-0.7.0-API文档-中英对照版.zip

    赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-compat_2.11-0.7.0.pom; 包含翻译后的API文档:scala-java8-compat_2.11-0.7.0-javadoc-API文档-中文(简体)-英语-...

    面向Java开发人员Scala指南,Scala和servlet的比较

    相比于Java的冗长代码,Scala通过其强大的类型系统和表达式语法,能够用更少的代码实现同样的功能。例如,Java中的servlet需要重写多个方法如`doGet`和`doPost`,而在Scala中,可以通过高阶函数和模式匹配来简化这些...

    scala-java8-compat_2.11-0.7.0-API文档-中文版.zip

    赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-compat_2.11-0.7.0.pom; 包含翻译后的API文档:scala-java8-compat_2.11-0.7.0-javadoc-API文档-中文(简体)版.zip;...

    JavaSE安装包(3) 包括scala-SDK,向日葵(远程工具),阿里Java代码规范等

    Scala-SDK提供了一系列开发工具和库,包括编译器、开发环境、类库和插件,以帮助开发者更快速、高效地编写和调试Scala代码。 2. 向日葵(远程工具):向日葵是一种远程工具,可用于远程桌面访问、文件传输、屏幕...

    基于Java+Scala实现的深圳地铁大数据客流分析系统源代码+数据+详细文档

    基于Java+Scala实现的深圳地铁大数据客流分析系统源代码+数据+详细文档,该项目主要分析深圳通刷卡数据,通过大数据技术角度来研究深圳地铁客运能力,探索深圳地铁优化服务的方向 以下是我的开发环境,仅作参考: ...

    scala:scala代码

    在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...

    Java中的函数式编程_Java_Scala_下载.zip

    "Java中的函数式编程_Java_Scala_下载.zip"可能包含的资料可能涵盖了如何在Java 8及更高版本中利用函数式编程技术,以及与Scala等函数式语言的对比分析,帮助开发者更好地理解和运用这些概念,提升代码质量和开发...

Global site tag (gtag.js) - Google Analytics