scala基础(变量、条件判断、循环)

我会带着你远行 2022-05-20 06:48 317阅读 0赞

1 scala 介绍

类似于java,也是jvm的一门编程语言,集成面向对象和函数式编程的各种特性

2 scala特点

(1)面向对象: 一切皆对象, 和java一致。
(2)函数式编程: 方法可以作为参数进行传递

(3)编码效率高: Scala语言表达能力强, 一行代码抵得上Java多行, 开发速度快;

3 scala与java的关系

Scala与Java的关系是非常紧密的! ! 因为Scala是基于Java虚拟机, 也就是JVM的一门编程语言。 所有Scala的代码,都需要经过编译为字节码, 然后交由Java虚拟机来运行。 所以Scala和Java是可以无缝互操作的。Scala可以任意调用Java的代码。 所以Scala与Java的关系是非常非常紧密的。

4 scala变量

在scala中声明变量有两个关键字val和**var**
val: 声明的变量不可以改变其引用, 相当于java中的final常量
var: 声明的变量可以改变其引用
但是在scala程序中, 通常建议使用val, 也就是常量, 因此比如类似于spark的大型复杂系统中, 需要大量的网络传输数据, 如果使用var, 可能会担心值被错误的更改 。

末尾可不用“;”,自带分号推断机制,如果多行代码写在了同一行,需要“;”分隔。

声明变量的通用格式:

关键字 变量名:变量类型 = 变量类型

  1. //val: 修饰的变量不可更改,类似于java中的final
  2. val name: String = "张三"
  3. val age: Int = 20
  4. //var: 修饰的变量可以更改
  5. var name2: String = "王五"

指定类型: 无论使用var或val关键字声明的变量, 都可以手动指定其类型, 如果不指定的话, scala会自动根据值, 进行类型的推断。
声明多个变量: 可以一次声明多个变量。

  1. //变量类型省略,scala会自动判断变量类型
  2. val name3 = "赵六"
  3. //Any类似于java中的Object,所有类型的父类型
  4. val color :Any = "red" //30 //true //"red"
  5. //一次给多个变量赋值
  6. val n1,n2,n3 :String = "scala"

数据类型
在scala中, 有数据类型Byte、 Char、 Short、 Int、 Long、 Float、 Double、 Boolean。貌似与Java的基本数据类型的包装类型相同, 但是scala没有基本数据类型与包装类型的概念, 统一都是类! scala自己会负责基本数据类型和引用类型的转换操作
类型的加强版类型: scala使用很多加强类给数据类型增加了上百种增强的功能或方法。
·例如, Scala还提供了RichInt、 RichDouble、 RichChar等类型, RichInt就提供了to方法, 1.to(10), 此处Int先隐式转换为RichInt, 然后再调用其to方法 。基本操作符
•scala的算术操作符与java的算术操作符也没有什么区别, 比如+、 -、 *、 /、 %等,以及&、 |、 ^、 >>、 <<等。
但是, 在scala中, 这些操作符其实是数据类型的方法, 比如1 + 1, 可以写做1.+(1)
•例如, 1.to(10), 又可以写做1 to 10
• scala中没有提供++、 —操作符, 我们只能使用+和-, 比如num = 1, num ++是错误的, 必须写做num += 1.

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ltMDEyMTM_size_16_color_FFFFFF_t_70

Any的父类是Object

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ltMDEyMTM_size_16_color_FFFFFF_t_70 1

容易混淆的几个类型:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ltMDEyMTM_size_16_color_FFFFFF_t_70 2

  1. /**
  2. * scala中没有基本数据类型和引用类型,统一都是类!Int、Double...
  3. */
  4. //操作符统一都是方法
  5. //to 左闭右闭
  6. println(1.to(10))
  7. println(1 to 10)
  8. //until 左闭右开
  9. println(1 until(10))
  10. //scala中没有++操作,可以使用+=
  11. var i = 0
  12. i+=1

5 scala条件判断

if**条件判断
if表达式的定义: 在Scala中, if表达式是
有值的, 就是if或者else中最后一行语句返回的值。
·例如, val num= 30; if (num> 18) 20 else 18
·
可以将if表达式赋予一个变量, 例如, val num= if (age > 18) 1 else 0
·if表达式的类型推断: 由于if表达式是有值的, 而if和else子句的值类型可能不同, Scala会自动进行推断, 取两个类型的公共父类型。
·例如, if(age > 18) 1 else 0, 表达式的类型是Int, 因为1和0都是Int
·例如, if(age > 18) “adult” else 0, 此时if和else的值分别是String和Int, 则表达式的值是Any, Any是String和Int的公共父类型
·如果if后面没有跟else, 则默认else的值是
Unit, 也用()**表示, 类似于java中的void或者null。 例如, val
age = 12; if(age > 18) “李四”。 此时就相当于if(age > 18) “李四” else ()

  1. val num = 20
  2. //if else 都是有返回值的,返回值就是最后一条语句的返回值;因为有返回值,所以if else可以赋值给一个变量
  3. if (num < 20) "zhangsan" else "lisi"
  4. val name = if (num < 20) "zhangsan" else "lisi"
  5. println(name)
  6. //在Scala中,无论是方法或函数以及条件判断,只要有返回值的,都可以不需加return
  7. //if else中,如果返回值类型不一样,scala会自动推断出两者的公共父类型
  8. val name2 = if (num < 20) "zhangsan" else 12
  9. println(name2)
  10. //如果缺省了else,默认返回值为Unit,用()表示,相当于java中的void
  11. val name3 = if (num < 20) "lisi"
  12. println(name3)在Scala中,无论是方法或函数以及条件判断,只要有返回值的,都可以不需加return
  13. //if else中,如果返回值类型不一样,scala会自动推断出两者的公共父类型
  14. val name2 = if (num < 20) "zhangsan" else 12
  15. println(name2)
  16. //如果缺省了else,默认返回值为Unit,用()表示,相当于java中的void
  17. val name3 = if (num < 20) "lisi"
  18. println(name3)

6 scala循环

while 循环: Scala有while循环, 基本语义与Java相同。

  1. var n = 10
  2. while(n > 0) { println(n); n -= 1}

跳出循环语句
scala没有提供类似于java的break语句, 但是可以使用boolean类型变量、return或者Breaks的break函数来替代使用 。

  1. import scala.util.control.Breaks._
  2. var num = 10
  3. /* breakable({
  4. do {
  5. num -= 1
  6. println(num)
  7. if (num < 0) break()
  8. } while (num < 10)
  9. })*/
  10. //使用标记为跳出while循环
  11. var flag = true
  12. while(flag){
  13. num +=1
  14. println(num)
  15. if(num >20) flag=false
  16. }
  1. 遍历(range范围, 字符串, 数组)

    //to,左闭右闭

    1. for (i <- 0 to 10) {
    2. // println(i)
    3. }
    4. //until, 左闭右开
    5. for (a <- 0 until 10) {
    6. // println(a)
    7. }
    8. //遍历字符串
    9. for (c <- "abcdef") {
    10. // println(c)
    11. }
    12. //遍历数组
    13. val arr2 = Array(1, true, "string")
    14. // for (i <- arr2) println(i)
  2. 多重for循环

  1. //多重for
  2. // for (m <- 1 to 9; n <- 1 to 9) println(m +"*" +n+"="+m*n)
  1. if守卫: 取偶数 for(i <- 1 to 100 if i % 2 == 0) println(i)
  1. //if 守卫
  2. // for(b <- 1 to 10 if (b %2 == 0)) println(b)
  1. for推导式: 构造集合 for(i <- 1 to 10) yield i
  1. //for推导式
  2. val arr = for (c <- 1 to 5) yield c * 2
  3. // for(i <- arr) println(i)
  4. //中断for循环
  5. breakable({
  6. for (i <- 1 to 10) {
  7. println(i)
  8. if (i > 5) {
  9. break()
  10. }
  11. }
  12. })

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读