美文网首页
scala初探-导入

scala初探-导入

作者: 钟俊源 | 来源:发表于2019-06-17 21:18 被阅读0次

      本教程基于scala官网的的tour of scala制作,如有对文章内容有任何建议,欢迎通过站内信或邮箱zhujunyuan@yeah.net沟通交流。

    一、环境安装

    1.搭建java环境,通过oracle官网下载安装jdk,本文基于jdk1.8.0_191-b12,如果使用openJdk,配置上可能有差异,请留意。安装教程可参考官网,下载解压,编辑环境变量即可。

    2.从scala官网下载intellij版本(包含ide,相当与jdk捆绑netbean套装)或者sbt版本(需要自行配置环境变量,mac下可以通过

    brew install scala
    

    命令直接安装(无需配置环境变量),linux下载安装repo后可以通过yum命令直接安装,可以查看官网教程:scala官网使用教程

    二、scala旅程正式开始

    表达式

    1.打开scala自带的命令行模式

    scala
    

    2.熟悉下基础

    • 打印helloworld:
    println("Hello world!")
    
    • 算数表达式支持
     println( 1 + 1 )
    
    • val变量支持(不可变对象,相当于常量声明)
    val a = 1 + 1
    println( a )
    

    常量声明支持类型指定,比如

    val a : Int = 2
    
    • 变量声明
    var x = 3
    x = 5
    

    同样的可以在变量后加上:再加指定类型

    var x : Int = 2
    
    函数块
    • 函数块都是通过{},需要注意的是scala的函数块是有返回值的,官方给的说明是

    The result of the last expression in the block is the result of the overall block
    函数块的最后一个表达式就是函数块整体的返回值

    尝试下

    scala> println({})
    ()
    #返回Unit#
    scala> println({ val x = 6 })
    ()
    #赋值语句没有返回值#
    scala> println({ val x = 6; x + 1 })
    7
    #算数表达式返回计算结果#
    scala> println( {{ var x = 6 ; x + 1 }} )
    7
    #函数块内可以嵌套函数块#
    
    函数
    • 匿名函数
    scala>  ( x : Int ) => x + 1
    res6: Int => Int = $$Lambda$1089/1731588624@4567fb2b
    

    这个函数中x代表形参名称,:后接参数类型,多个参数之间用,隔开即可,与c或java中的方法不同,函数即使有返回值也不用申明返回值的类型,尝试些例子

    scala> val addOne = (x : Int) => x + 1
    addOne: Int => Int = $$Lambda$1090/1828724670@d120d7c
    
    scala> addOne(10)
    res7: Int = 11
    
    scala> val add = (x : Int , y : Int) => x + y
    add: (Int, Int) => Int = $$Lambda$1099/2144511610@163df259
    
    scala> add(1 , 2)
    res8: Int = 3
    
    #返回值测试,可以返回不同类型的值,类型为Any#
    scala> val test = (x : Int, y : String) => { if(x > 1) x else y }
    test: (Int, String) => Any = $$Lambda$1127/367954017@6afaf27
    
    scala> test(1 , "dale")
    res9: Any = dale
    
    scala> test(2 , "dale")
    res10: Any = 2
    

    可以函数的灵活度相较于c和java灵活性方面优势还是挺大的。

    方法

    使用def关键字进行定义,与函数不同的是,方法可以接受多个参数列表,尝试下:

    #可以传递同时传递多个参数列表,返回类型可以省略
    scala> def addParameter(x : Int, y : Int)(z : Int): Int= x + y + z
    addParameter: (x: Int, y: Int)(z: Int)Int
    
    scala> println( addParameter(1, 2)(3) )
    6
    
    #可以不传参数
    scala> def name = System.getProperty("user.name")
    name: String
    
    scala> println( "Hello" + name )
    Hellojunyuan
    

    与函数相比,方法还有另外一些区别,现先暂时认为他们是一致的。

    使用关键字class进行定义,后接类名(构造器参数名及类型, 然后在{}中书写方法,需要注意的是,当没有任何有意义的值要返回时,官方推荐使用: Unit做为返回值,这个关键字和java和C中的void关键字使用类似,区别是scala中表达式是必须有返回值的,Unit实际上是一个类的单例,这个类中不包含任何信息,可以参考官方说明:

    A difference is that because every Scala expression must have some value, there is actually a singleton value of type Unit, written (). It carries no information.

    scala> class Gretting( prefix : String , suffix : String){
         |     def sayHello( name : String ) : Unit{
         |         println( "Hello\n" + prefix +  name + suffix )
         |     }
         | }
    defined class Gretting
    
    scala> val greeting = new Gretting( " Hero ", "XXXXX" );
    greeting: Gretting = Gretting@28b5cee
    
    scala> greeting.sayHello("dale")
    Hello
     Hero daleXXXXX
    

    更多类相关的知识在后续章节中探讨

    case class

    根据官方说明,这是一种特殊的类,它又一个显著的特征:默认情况下,这个类是不可变的,并且这个类的实例根据值进行比较。这个特性对于java程序员相当实用的一项功能了,不需要重新书写hashCode和equals方法,即可实现基于值的比较。

    a: Point = Point(1,2)
    
    scala> var b = Point( 1, 2 )
    b: Point = Point(1,2)
    
    scala> a == b
    res15: Boolean = true
    
    scala> a = Point( 3, 4 )
    a: Point = Point(3,4)
    
    scala> b
    res16: Point = Point(1,2)
    

    很多其他的实用特性,参考后续章节

    对象

    object是他们自身定义的一个实例,你可以当他们是自身的一个单例

    Objects are single instances of their own definitions. You can think of them as singletons of their own classes.

    通过object关键字进行定义:

    scala> object Sequence{
         |   private var curVal = 0
         |   def create() : Int = {
         |      curVal += 1
         |      curVal
         |   }
         | }
    defined object Sequence
    
    scala> Sequence.create()
    res20: Int = 1
    
    scala> Sequence.create()
    res21: Int = 2
    
    Traits

    从说明看,类似java中的interface,可以组合,同样支持默认的实现。

    Traits are types containing certain fields and methods. Multiple traits can be combined.

    scala> trait Greeter{
         |   def say( word : String )
         | }
    defined trait Greeter
    
    scala> class Test( name : String ) extends Greeter{
         |    def say( word : String ){
         |       println( name + "\t" + word )
         |   }
         | }
    defined class Test
    
    scala> val dale = new Test("dale")
    dale: Test = Test@2f47ebc7
    
    scala> dale.say("hi")
    dale    hi
    
    scala> trait Greeter{
         |    def say( word : String ) : Unit = {
         |        println( "default: " + word)
         |    }
         | }
    defined trait Greeter
    
    scala> class DefaultGreeter extends Greeter
    defined class DefaultGreeter
    
    scala> val greeter = new DefaultGreeter()
    greeter: DefaultGreeter = DefaultGreeter@dce1556
    
    scala> greeter.say("dengdengdeng")
    default: dengdengdeng
    
    主方法

    也就是java中的main方法,因为jvm要求一个接受string数组的main命名的方法作为运行入口。当使用object时,可以这样使用:

    scala> object Main {
         |   def main(args: Array[String]): Unit =
         |     println("Hello, Scala developer!")
         | }
    defined object Main
    

    相关文章

      网友评论

          本文标题:scala初探-导入

          本文链接:https://www.haomeiwen.com/subject/jkemxctx.html