Scala基础语法

/*
学慕课网上《Scala程序设计》课程跟着敲的代码
作为代码参考也是很好的
在scala_ide.org上下载eclipse IDE,新建一个worksheet,就可以像在xcode的playground那样玩了,
就是如下所示,写变量直接在右边显示结果
链接:scala集合文档http://docs.scala-lang.org/zh-cn/overviews/collections/introduction

函数式编程,核心是状态不变
*/

var x = 1                                       //> x  : Int = 1
val y = 2                                       //> y  : Int = 2
lazy val z = x + y                              //> z: => Int

//Byte Short Int Long Float Double Boolean Char Unit
val b:Byte = 10                                 //> b  : Byte = 10
var u:Unit = ()                                 //> u  : Unit = ()

//类型体系很别致
//Any -> AnyVal, AnyRef
//AnyVal基本类型
//AnyRef引用类型
//Null/Nothing作为最后子类

def foo = throw new Exception("")               //> foo: => Nothing

var name = "123"                                //> name  : String = 123
var name2 = s"456 ${name}"                      //> name2  : String = 456 123

//定义函数
def function(param:Int):Int = {
    1
}                                               //> function: (param: Int)Int
def function2(param:Int) = {
    1
}                                               //> function2: (param: Int)Int
//调用函数
function2(1)                                    //> res0: Int = 1
//能省略就省略的方法定义
def func = 1                                    //> func: => Int

if(true) 1 else 2                               //> res1: Int = 1

//循环
var l = List("a", "b", "c")                     //> l  : List[String] = List(a, b, c)
for{
    s <- l
    s1 = s.toUpperCase()
    if(s1.length == 1)//filter
}yield(s1)                                      //> res2: List[String] = List(A, B, C)

//try..catch..finally
try{
    Integer.parseInt("dog")
}catch{
    case _ => 0
}finally{
    println("oo")
}                                               //> oo
                                                //| res3: Int = 0

//match 类似 switch
val i = 1                                       //> i  : Int = 1
i match {
    case 1 => "one"
    case 2 => "two"
    case _ => "others"
}                                               //> res4: String = one

//Call By Value || Call By Name
//先确定参数的值,再执行函数
//还是直接把参数传入函数,在函数中确定参数的值
def test1(x:Int) = x                            //> test1: (x: Int)Int
def test2(x: => Int) = x                        //> test2: (x: => Int)Int

//高阶函数
def operate(f: (Int,Int)=>Int)={
    f(4,4)
}                                               //> operate: (f: (Int, Int) => Int)Int

//返回值是函数
def greeting() = (name:String) => {"hello " + name}
                                                //> greeting: ()String => String

//柯里化
def add(a: Int)(b:Int) = a + b                  //> add: (a: Int)(b: Int)Int
add(2)(2)                                       //> res5: Int = 4

var add3 = add(3)_                              //> add3  : Int => Int = <function1>

add3(5)                                         //> res6: Int = 8

/*
  以下都是常用的集合
*/
val lista = List(1, 2, 3, 4)                    //> lista  : List[Int] = List(1, 2, 3, 4)
val listb = 0 :: lista                          //> listb  : List[Int] = List(0, 1, 2, 3, 4)
val listc = "x" :: "y" :: "z" :: Nil            //> listc  : List[String] = List(x, y, z)

val listd = lista ::: listc                     //> listd  : List[Any] = List(1, 2, 3, 4, x, y, z)
lista.head                                      //> res7: Int = 1
listc.tail                                      //> res8: List[String] = List(y, z)
lista.isEmpty                                   //> res9: Boolean = false

//编写递归函数处理list
def deallist(l: List[Int]): String = {
    if(l.isEmpty) ""
    else l.head.toString + " " + deallist(l.tail)
}                                               //> deallist: (l: List[Int])String
deallist(lista)                                 //> res10: String = "1 2 3 4 "
//对list应用filter
lista.filter(x=>x%2==1)                         //> res11: List[Int] = List(1, 3)
lista.filter(_%2==1)                            //> res12: List[Int] = List(1, 3)

"99 Red Balloons".toList.filter(x=>Character.isDigit(x))
                                                //> res13: List[Char] = List(9, 9)
//一直取直到..
"99 Red Balloons".toList.takeWhile(x=>x!=‘B‘)   //> res14: List[Char] = List(9, 9,  , R, e, d,  )

//对list应用map
listc.map(x=>x.toUpperCase)                     //> res15: List[String] = List(X, Y, Z)
listc.map(_.toUpperCase)                        //> res16: List[String] = List(X, Y, Z)

//二维数组
val liste = List(lista, List(4,5,6))            //> liste  : List[List[Int]] = List(List(1, 2, 3, 4), List(4, 5, 6))
//把二维数组转为一维
liste.flatMap(_.filter(_%2==0))                 //> res17: List[Int] = List(2, 4, 4, 6)

//reduce,参数为一个函数,该函数有两个参数,俩参数与一个返回值这三者的类型都相同
lista.reduceLeft(_ + _)                         //> res18: Int = 10

//fold
//不断把值加上去
lista.foldLeft(0)(_ + _)                        //> res19: Int = 10
//不断把值乘上去
lista.foldLeft(1)(_ * _)                        //> res20: Int = 24
//不断把值连到字符串上
lista.foldLeft("")(_ + _)                       //> res21: String = 1234

//range,用to或until(右闭或右开)
1 to 10                                         //> res22: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6,
                                                //|  7, 8, 9, 10)
1 until 10 by 2                                 //> res23: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

//stream 惰性求值
val s = (1 to 10000).toStream                   //> s  : scala.collection.immutable.Stream[Int] = Stream(1, ?)
s.head                                          //> res24: Int = 1
s.tail                                          //> res25: scala.collection.immutable.Stream[Int] = Stream(2, ?)

//tuple
(1,2)                                           //> res26: (Int, Int) = (1,2)
//类似数据库里的一行记录,可以作为函数的返回值,打包返回多个值
val alice = (1, "Alice", "Math", 95.5)          //> alice  : (Int, String, String, Double) = (1,Alice,Math,95.5)
alice._1                                        //> res27: Int = 1

def sumSq(in : List[Int]):(Int,Int,Int)=
    in.foldLeft((0,0,0))((t,v)=>(t._1+1, t._2+v, t._3+v*v))
                                                //> sumSq: (in: List[Int])(Int, Int, Int)

sumSq(lista)                                    //> res28: (Int, Int, Int) = (4,10,30)

//map
val map = Map(1 -> "David", 9->"Beckham")       //> map  : scala.collection.immutable.Map[Int,String] = Map(1 -> David, 9 -> Be
                                                //| ckham)
map(1)                                          //> res29: String = David
map.contains(1)                                 //> res30: Boolean = true
map.keys                                        //> res31: Iterable[Int] = Set(1, 9)
map.values                                      //> res32: Iterable[String] = MapLike(David, Beckham)
map + (10 -> "Zidane")                          //> res33: scala.collection.immutable.Map[Int,String] = Map(1 -> David, 9 -> Be
                                                //| ckham, 10 -> Zidane)
map - 1                                         //> res34: scala.collection.immutable.Map[Int,String] = Map(9 -> Beckham)
map ++ List(7 -> "Ronaldo", 9 -> "Raul")        //> res35: scala.collection.immutable.Map[Int,String] = Map(1 -> David, 9 -> Ra
                                                //| ul, 7 -> Ronaldo)
map -- List(1,9,2)                              //> res36: scala.collection.immutable.Map[Int,String] = Map()

/*快速排序,好短!*/
def sort(a:List[Int]):List[Int] =
if(a.length < 2) a
else
sort(a.filter(_<a.head)) ++ a.filter(_==a.head) ++ sort(a.filter(_>a.head))
                                                //> sort: (a: List[Int])List[Int]

sort(List(3,1,2,5,2,7))                         //> res37: List[Int] = List(1, 2, 2, 3, 5, 7)

  

时间: 2024-10-23 04:46:26

Scala基础语法的相关文章

【Scala学习之一】 Scala基础语法

环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark-1.6 Scala是一种混合功能编程语言,类似java,运行于JVM,集成面向对象编程和函数式编程的各种特性.(1)Scala可以与Java互操作:它用scalac这个编译器把源文件编译成Java的class文件,从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的

Scala基础语法 (一)

如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递.接下来我们来理解下,类,对象,方法,实例变量的概念: 对象 - 对象有属性和行为.例如:一只狗的状属性有:颜色,名字,行为有:叫.跑.吃等.对象是一个类的实例. 类 - 类是对象的抽象,而对象是类的具体实例. 方法 - 方法

Scala系统学习(三):Scala基础语法

如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合.现在我们简单地看一下类,对象,方法和实例变量的含义. 对象 - 对象有状态和行为.一个对象是类的一个实例.例如 - 狗有状态:颜色,名称,品种,它行为有:摇摆,吠叫和吃东西. 类 - 可以将类定义为描述与该类相关的行为/状态的模板/蓝图. 方法 - 一个方法基本上是一种行为.一个

scala函数式编程(二) scala基础语法介绍

上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些java或者python的基础,毕竟大部分人不会将scala当作第一门学习编程的语言. 不过这些语法知识记不住也没关系,本身语法这种东西就应该在使用中被记住.这里写这篇的目的也只是梳理一遍,方便大家对语法有个初步的印象,后面可以随时查询. PS:所使用的版本是scala 2.11.8,那我们开始吧 一.

Scala基础语法(声明定义、标识符命名、Scala脚本入门)

一.声明与定义(赋值) 1.val, 常量声明   val x:T val x:T=e 2.var, 变量声明   var x:T var x:T=e ?类型省略(默认类型)val x=e var x=e ? 声明省略(连续声明) val x1,x2,x3 等价于 val x1;val x2; var x1,x2,x3:T=e  等价于  var xn:T=e 3.def,函数声明def abc(xn:T):T*=e def adder(m:Int,n:Int) =m+n def adder()

scala 基础语法

文章内容全部来自:http://twitter.github.io/scala_school/zh_cn/index.html 表达式 scala> 1 + 1 res0: Int = 2 值 你可以给一个表达式的结果起个名字赋成一个不变量(val). scala> val two = 1 + 1 two: Int = 2 变量 如果你需要修改这个名称和结果的绑定,可以选择使用var. scala> var name = "steve" name: java.lang

Scala基础语法介绍

1.变量的定义 注意:在scala中没有static的概念,在object这个关键字修饰的类中所有的方法和属性都是static的.这里的object类叫做伴生类,目前不涉及. 例: object Test01{ def main(args: Array[String]): Unit = { //使用val定义的变量是不可变的,相当于java中的final修饰的 val v1=1 //使用var定义的变量的值是可变的,在scala中鼓励使用的是val var v2=2 //在定义变量的时候,也可以

第1节 Scala基础语法:2、环境和插件

1.    Scala编译器安装 1.1.   安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 1.2.   安装Scala 1.2.1.    Windows安装Scala编译器 访问Scala官网http://www.scala-lang.org/下载Scala编译器安装包,目前最新版本是2.12.x,这里下载scala-2.11.8.msi后点击下一步就可以了(自动配置上环境变量).也可以下载scala-2.11.8.zip,解压后配置上环境变量就可

第1节 Scala基础语法:9、数组

5.    数组.映射.元组.集合 5.1.   数组 5.1.1.    定长数组和变长数组 (1)定长数组定义格式: val arr=new Array[T](数组长度) val arr=Array(1,2,3,4,5) (2)变长数组定义格式: valarr = ArrayBuffer[T]() 注意需要导包:import scala.collection.mutable.ArrayBuffer package cn.itcast.scala import scala.collection