美文网首页
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初探-导入

      本教程基于scala官网的的tour of scala制作,如有对文章内容有任何建议,欢迎通过站内信或邮箱zh...

  • Scala-13.包和导包

    Scala导入成员变量的方法: 随处可使用import 导入类,包或者对象 导入类时隐藏并且重命名它们 Scala...

  • scala隐式转换自动删除

    之前写scala代码创建SparkStreaming之后就会去导入scala的隐式转换,防止因为以后忘记导入而出现...

  • scala:import

    java中的import叫导入类,scala叫导入包 默认自动引入的包java.lang.*、scala.*、Pr...

  • 【Scala】Scala函数式编程初探

    函数式编程 函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda...

  • Scala文件操作详解

    遍历一个文件中的每一行 必须导入scala.io.Source类: import scala.io.Source ...

  • 数据处理基石:Pandas数据探索

    Pandas数据初探索 本文介绍的是Pandas数据初探索。当我们生成或者导入了数据之后,通过数据的探索工作能够快...

  • Scala学习第七节:定长与变长Array

    定长数组 变长数组 变长数组 需要导入scala.collection.mutable.ArrayBuffer

  • Linux安装Scala和Spark

    一:安装Scala: 1.导入压缩包 在/mnt/hgfs/tool/目录下找到Scala压缩包将其复制到/usr...

  • iOS传感器篇:数据获取

    iOS传感器篇:CoreMotion初探 使用 CMAltimeter 气压计 导入 使用 1. 创建CMMoti...

网友评论

      本文标题:scala初探-导入

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