Scala(一)

来源:互联网 发布:java 图形验证码 开源 编辑:程序博客网 时间:2024/06/11 04:39

Scala魅力所在

1.优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。

2.速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。

3. 能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。 


4Spark的开发语言,掌握好scala,就可以站在巨人的肩膀上学习spark

两点,

1scala是函数式编程语言,基于java开发的,和java一个级别

2scalaspark的开发语言,可以融合到是大数据生态圈

Scala开发环境
1.安装jdk
2.安装scala(安装,配置环境变量即可)


Linux安装Scala

下载Scala地址http://downloads.typesafe.com/scala/2.11.8/scala-2.11.8.tgz

1,解压Scala到指定目录

# tar -zxvf scala-2.11.8.tgz -C /usr/local/

2,创建一个软连接

# ln -s /usr/local/scala-2.11.8 /usr/local/scala

3,配置环境变量,将scala加入到PATH

# vi /etc/profile

export SCALA_HOME=/usr/local/scala

export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin


编写第一个Scala程序

vim Scala

object ScalaTest {def main(args: Array[String]) :Unit={println("hello scala")}}

代码编译:

# scalac ScalaTest

代码运行:

# scala ScalaTest


IDEA插件的安装




浏览插件→搜索Scala并点击install进行安装。或者本地磁盘安装



新建项目
Create New Project



Scala基础

编程式体验Spark-Shell


用Spark进行单词个数的统计



常用类型

ScalaJava一样,

7种数值类型:ByteCharShortIntLongFloatDouble

2种非数值类型: BooleanUnit  一个() 相当于java中的void 还有String类型

Scala的继承层级



声明变量

定义变量使用var或者 val关键字

语法:
var|val
变量名称 (: 数据类型) =变量值

bject VariableTest {
  def main(args: Array[String]) {
   
 // 使用val定义的变量值是不可变的,相当于java里用final修饰的变量
  
  val i = 1
    
// 使用var定义的变量是可变的,在Scala中鼓励使用val
    
var s = "hello"
    
  //Scala编译器会自动推断变量的类型,必要的时候可以指定类型  //变量名在前,类型在后
val str: String = "world"
  
}

}

条件表达式
Scala的条件表达式比较简洁

object ConditionTest {
  def main(args: Array[String]) {

    val x = 1

    //判断x的值,将结果赋给y

    val y = if (x > 0) 1 else -1

    //打印y的值

    println(y)


    //支持混合类型表达式

    val z = if (x > 1) 1 else "error"

    //打印z的值

    println(z)


    //如果缺失else,相当于if (x > 2) 1 else ()

    val m = if (x > 2) 1

    println(m)


    //在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void

    val n = if (x > 2) 1 else ()

    println(n)


    //if和else if

    val k = if (x < 0) 0

    else if (x >= 1) 1 else -1

    println(k)

  }

}

每一个条件语句,都有返回值,默认返回值是最后一行的内容,如果没有内容或者内容为空,那么返回值就是Unit,或者说是()

多条件分支中,缺少了某一个分支,默认会返回Unit

我们的条件表达式,可以使用{},如果业务逻辑只有一行,可以省略{},完全放在一行。

if(x>2) 3 else 5

条件表达式里面,不能使用return这一关键字,默认返回最后一行的内容。

块表达式
object BlockExpressionTest {  def main(args: Array[String]): Unit = {    val  x=0//    在scala中,{}中最后一个表达式的值就是块的值,本例中result就是块的值,result后面就是一个块    val result={      if(x>0){        -1      }else if(x>=1){        1      }else{        "error"      }    }    println(result)  }}

循环

在scala中有for和while循环,用for循环比较多

for循环语法结构:for(<- 表达式/数组/集合)

两个生成器值得注意:to until

1 to 10 生成 Range(1,2,3,4,5,6,7,8,9,10)左右都是闭区间

1 until 10 生成 Range(1,2,3,4,5,6,7,8,9)左边是闭区间,右边是开区间

还有一个例子

 val arr = Array(1, 2, 3, 4)    for (i <- 0 to 3)      println(i)    for (i <- 0 to 3)      println(arr(i))
输出的是 0 1 2 3 

输出的是 1 2 3 4 根据角标输出对应位置的数还是输出本身的数,要分清楚


在for循环中,通过添加守卫来实现输出满足特定条件的数据

val arr=Array(1,2,3,4)    for(i<- arr if i%2==0)      print(i+" ")

嵌套for的写法
def main(args: Array[String]): Unit = { val arr=Array(1,2,3,4)  for(i<- 1 to 3;j<- 1 to 3 if i!=j)    print((10*i+j)+" ")     println()  print("----------------")}

输出结果是 12 13 21 23 31 32 
----------------

嵌套for只会把for下面一行放入“大括号”内,后面的都是按顺序执行



val arr2 = for (i <- 1 to 10) yield i * 10print(arr2)
输出结果Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

val arr2 = for (i <- 1 to 10) yield i%2==0print(arr2)

输出结果Vector(false, true, false, true, false, true, false, true, false, true)

yield的作用就是对元素进行操作,返回一个新的数组



函数式编程

后面经常对数组进行操作的方式:链式编程

map:对集合或者数组中的每一个元素进行操作,该方法接收一个函数,具体的业务逻辑是自己定义的

filter:过滤器,过滤出满足条件的元素


调用方法(运算符重载为方法)

a+b

本质就是 a.+(b)  a调用了名字为+的方法  

a 方法 b 可以写成a.方法(b)

e.g.:2+3    本质 2.+(3)




方法定义和调用

调用直接名称调用即可

正常情况下,可以不指定返回值的类型

def m1(x:Int,y:Int)=x*y

对于递归方法,必须指定返回类型

def rec(n:Int):Int= if (n==0) 0 else n*rec(n-1)


对于有return关键字的,必须指定返回类型

def meth1(x:Int,y:Double):Double = return x*y


如果方法没有显式指定返回值类型,那么返回值就是()

如果定义方法的时候没有参数,也没有使用(),那么调用的时候就不能有()

如果方法定义的时候没有参数,使用了(),那么调用的时候可以加()也可以不加()








函数的定义和调用