当前位置: 首页 > news >正文

Scala基础

1.1. 声明变量

package cn.itcast.scala
object VariableDemo {
  def main(args: Array[String]) {
    //使用val定义的变量值是不可变的,相当于java里用final修饰的变量
    val i = 1
    //使用var定义的变量是可变得,在Scala中鼓励使用val
    var s = "hello"
    //Scala编译器会自动推断变量的类型,必要的时候可以指定类型

    //变量名在前,类型在后
    val str: String = "itcast"
  }
}

1.2. 常用类型
Scala和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float、Double类型和1个Boolean类型。
1.3. 条件表达式
Scala的条件表达式比较简洁,定义变量时加上if else判断条件。例如:

package cn.itcast.scala

object ConditionDemo {
  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,Unit只有一个实例值,写成()。
    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)
  }
}

1.4. 块表达式
定义变量时用 {} 包含一系列表达式,其中块的最后一个表达式的值就是块的值。

package cn.itcast.scala

object BlockExpressionDemo {
  def main(args: Array[String]) {
    val a = 10

val b = 20
    //在scala中{}中包含一系列表达式,块中最后一个表达式的值就是块的值
    //下面就是一个块表达式
    val result = {

val c=b-a
val d=b-c

d   //块中最后一个表达式的值

}
 //result的值就是块表达式的结果
  println(result)

}
}

1.5. 循环
在scala中有for循环和while循环,用for循环比较多
for循环语法结构:for (i <- 表达式/数组/集合)

package cn.itcast.scala
object ForDemo {
  def main(args: Array[String]) {
    //for(i <- 表达式),表达式1 to 10返回一个Range(区间)

    //每次循环将区间中的一个值赋给i
    for (i <- 1 to 10)
      println(i)

    //for(i <- 数组)
    val arr = Array("a", "b", "c")
    for (i <- arr)
      println(i)

    //高级for循环
    //每个生成器都可以带一个条件,注意:if前面没有分号
    for(i <- 1 to 3; j <- 1 to 3 if i != j)
      print((10 * i + j) + " ")
    println()

    //for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合

    //每次迭代生成集合中的一个值
    val v = for (i <- 1 to 10) yield i * 10
    println(v)

  }

}

1.6. 调用方法和函数
Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有一点特别的:这些操作符实际上是方法。例如:
a + b
是如下方法调用的简写:
a.+(b)
a 方法 b可以写成 a.方法(b)
1.7. 定义方法和函数1.7.1. 定义方法
Scala基础
方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型
Scala基础
1.7.2. 定义函数
Scala基础
1.7.3. 方法和函数的区别
在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作,函数是一个对象,继承自FuctionN。
函数对象有apply、curried、toString、tupled这些方法。而方法不具有这些特性。
如果想把方法转换成一个函数,可以用方法名跟上下划线的方式。
案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面
Scala基础

package cn.itcast.scala

object MethodAndFunctionDemo {
  //定义一个方法
  //方法m2参数要求是一个函数,函数的参数必须是两个Int类型

  //返回值类型也是Int类型
  def m1(f: (Int, Int) => Int) : Int = {
    f(2, 6)
  }

  //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
  val f1 = (x: Int, y: Int) => x + y
  //再定义一个函数f2
  val f2 = (m: Int, n: Int) => m * n

  //main方法
  def main(args: Array[String]) {

    //调用m1方法,并传入f1函数
    val r1 = m1(f1)
    println(r1)

    //调用m1方法,并传入f2函数
    val r2 = m1(f2)
    println(r2)
  }
}

1.7.4. 将方法转换成函数(神奇的下划线)
将方法转换成函数,只需要在方法的后面加上一个下划线

转载于:https://blog.51cto.com/13587708/2152001

相关文章:

  • mysql进阶(七)数据库锁
  • caffe问题
  • HDU 6330--Visual Cube(构造,计算)
  • mysql 数据库修改名字
  • 设计模式-简单工厂、工厂方法模式、抽象工厂模式详解
  • 9种数据分析方法
  • 人群估值一般性算法
  • oracle获取过去两年的今天时间
  • SOFATracer 中 Disruptor 实践
  • C#抽象类与接口的区别【转】
  • 区块链时代的拜占庭容错:Tendermint(一)
  • 一致性算法Hash(Consistent Hashing)
  • Java 多线程
  • 微信小程序登录JAVA后台
  • yii2.0 验证码
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2017-08-04 前端日报
  • Apache的80端口被占用以及访问时报错403
  • Babel配置的不完全指南
  • iOS编译提示和导航提示
  • Java 内存分配及垃圾回收机制初探
  • 高程读书笔记 第六章 面向对象程序设计
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​【已解决】npm install​卡主不动的情况
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Neo4j下载安装以及初次使用
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)用.Net的File控件上传文件的解决方案
  • .gitignore文件设置了忽略但不生效
  • .Net - 类的介绍
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 后台导出excel ,word
  • .NET简谈设计模式之(单件模式)
  • @javax.ws.rs Webservice注解
  • @staticmethod和@classmethod的作用与区别
  • [.net] 如何在mail的加入正文显示图片
  • [2018-01-08] Python强化周的第一天
  • [ABC294Ex] K-Coloring
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [HNOI2006]鬼谷子的钱袋
  • [I2C]I2C通信协议详解(一) --- 什么是I2C