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

Scala学习笔记(1)

Scala的基础语法

1、变量类型

AnyVal

共有9种:

  Byte、Short、Int、Long、Float、Double、Char、Boolean、Unit(void)

AnyRef

  String....

2、val和var的区别

scala有两种定义变量的方式:val和var

val定义好变量后,无法更改变量的值,类似于java中的final

var定义的变量,可以多次修改。

unit表示无值,和其他语言中的void相同。

var 变量名称:变量类型 = 变量具体值

在不指定变量数据类型的情况下,scala会自动对其类型推导。

推荐使用val

3、循环

基本语法结构:for( 变量 <- 表达式) ,eg:for( i<- 0.until(s.length) )、for(ch <- "Hello" )

高级for循环:以变量 <- 表达式的形式提供多个生成器,用分号隔开它们,每个生成器都可以带一个守卫:以if开头的Boolean表达式。

for( i < 1 to 3 ;j <- 1 to 3 ) print( (10* i +j ) + " ")
//打印:11 12 13 21 22 23 31 32 33 ,每个i都会经历j<-1 to 3

for( i < 1 to 3 ; from = 4 -i ;j <- from to 3 ) print( (10* i +j ) + " ")
//打印: 13 22 23 31 32 33 ,每个i都会经历from = 4 -i ;每个form都会经过j <- from to 3

for( i < 1 to 3 ;j <- 1 to 3 if i != j) print( (10* i +j ) + " ") //带守卫,注守卫没有分号
//打印: 12 13 21 23 31 33 ,每个i都会经历j <- 1 to 3 if i != j

4、break

scala中没有break语句,但是Breaks对象提供了break方法。

引入Breaks包:

import scala.util.control.Breaks._
var a = 9
    breakable(
      while(true){
        println(a)
        a = a - 1
        if(a == 5) break()
      }
    )

5、yield的用法

yield 关键字的简短总结:

针对每一次 for 循环的迭代, yield 会产生一个值,被循环记录下来 (内部实现上,像是一个缓冲区).
当循环结束后, 会返回所有 yield 的值组成的集合.
返回集合的类型与被遍历的集合类型是一致的.

val array = Array(1,2,3,4,5,6)
    val result = for(i <- array if i %2 == 0) yield i
    println(result.toBuffer)

 遍历文件:

import java.io.File

import scala.io.Source
/**
  * Created by fred on 2018/7/1.
  */
object YieldDemo{
  val files = (new File("/Users/fred/Desktop/Data/scala_test")).listFiles()

//  for(file <- files){
//    println(file)
//  }

  def fileLines(file:java.io.File) ={
    Source.fromFile(file).getLines.toList
  }

  def main(args: Array[String]): Unit = {
    val result = for{
      file <- files if file.getName.endsWith(".txt")

      line <- fileLines(file)

      trimmedLine = line.trim if trimmedLine.matches(".*scala.*")

    } yield trimmedLine.length

    result.foreach(println)

  }
}

 6、方法和函数

方法:方法作用于对象,是对象的行为。

定义方法的基本格式是:def 方法名称(参数列表):返回值 = 方法体

函数定义有两种方式:

(1)val 函数名称:(参数名称:参数类型...) => 业务运算逻辑

(2)val 函数名称:(参数类型...) => 返回值类型 = (参数) => 业务运算逻辑

scala中方法的返回值默认是方法体中的最后一行表达式 的值,当然也可以用return来执行返回值,但scala并不推荐这么做。

scala提供一些强大的功能:类型推断。在定义方法时,可以不显式 的制定方法的返回值,scala编译器可以根据函数体中的具体内容来推断方法的返回值类型。

/*不显示的指定返回值类型*/
  def function01(a:Int, b:Int) = {
    a + b
  }
  /*显示的指定返回值类型*/
  def function02(a:Int, b:Int):Int = {
    a + b
  }

 需要注意的是,若使用return来制定函数的返回值,次数scala的类型推断将会失效,必须显式执行返回值类型。

返回值类型:1)函数不是递归的就不需要指定返回类型,可以根据=符号右侧表达推断出来。2)如果方法使用了return,必须制定方法的返回值类型

/*不显示的指定返回值类型
  *return时,若不指定返回值类型会编译出错
  * */
  def function01(a:Int, b:Int) = {
    return a + b
  }
  /*显示的指定返回值类型*/
  def function02(a:Int, b:Int):Int = {
    return a + b
  }
/*
    递归
     */
    def multiply(n:Int):Int = {
      if(n == 1) 1
      else n * multiply(n - 1)
    }

当然,方法也可以没有返回值(返回值是Unit)。

默认参数和带名参数

在定义方法参数时,可以为某个参数指定默认值,带有默认值的参数在被调用时可以不为其传入实参。

def function03(left:String = "[", content:String, right:String = "]"): Unit ={
    println(left + content + right)
  }

 上面定义的方法中,参数leftright已经指定默认值,可以用下面的方式进行调用

function03(content = "hello")

 这里有一点需要注意,当未被指定默认值的参数不是第一个参数时,参数名称不能省略

 /*这样调用是不对的*/
    function03("hello")

 

可变参数

当方法需要多个相同类型的参数时,可以用可变参数简化方法的定义

def sum(args:Int*){
      var result = 0
      for(arg <- args) result += arg
      println(result)
    }

 函数的定义:

/**
    * 函数的定义有两种方式
    */
  /*匿名函数*/
  (a: Int, b: Int) => a + b

  /*方式一
  val 函数名称:(参数名称:参数类型...) => 业务运算逻辑
   */
  val f0 = (a: Int, b: Int) => a + b
  /*
  方式二
  val 函数名称:(参数类型...) => 返回值类型 = (参数) => 业务运算逻辑
   */
  val f1: (Int, Int) => Int = (a, b) => a + b

 参数列表:对方法是可选的,对函数是必须的(函数参数列表可以为空)。函数本身可以作为方法的参数传入。

  def callFunc(a: Int, b: Int) = {
    f0(a, b)
  }

  def callFunc_1(a: Int, b: Int, f: (Int, Int) => Int) = {
    f(a, b)
  }

 在需要函数的地方可以提供一个方法(自动转换) 

例如,高阶函数接收的是一个函数,但也可以传入一个方法,scala会将这个方法自动转义成函数。

    def function04(x:Any) = println(x)
    val list = List[String]("a", "b", "c", "d")
    list.foreach(function04(_))

 

转载于:https://www.cnblogs.com/fredkeke/p/9251038.html

相关文章:

  • Ubuntu 下解压tar.xz方法
  • Java深究之String、StringBuffer、StringBuilder的区别
  • 主题 :学习与自我提升
  • php 向关联数组头部插入key value 保持数组关系不变
  • excel导出 ajax错误判断 数据为空判断
  • 分分钟用上C#中的委托和事件
  • python-day2-06-列表
  • 【短文】为什么我不在PHP的私有变量用下划线了?
  • angular-路由与导航部分梳理
  • C# Web Api一个小例子
  • 数塔-动态规划-ccf
  • 【Matplotlib】利用Python进行绘图
  • 单体架构风格
  • CSS outline和border区别
  • python学习之老男孩python全栈第九期_day009之文件操作总结
  • 时间复杂度分析经典问题——最大子序列和
  • Android 控件背景颜色处理
  • django开发-定时任务的使用
  • Elasticsearch 参考指南(升级前重新索引)
  • golang 发送GET和POST示例
  • IDEA 插件开发入门教程
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java应用性能调优
  • jquery cookie
  • Linux CTF 逆向入门
  • Spark RDD学习: aggregate函数
  • swift基础之_对象 实例方法 对象方法。
  • Vue 重置组件到初始状态
  • webpack入门学习手记(二)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从重复到重用
  • 解析 Webpack中import、require、按需加载的执行过程
  • 蓝海存储开关机注意事项总结
  • 如何合理的规划jvm性能调优
  • 如何进阶一名有竞争力的程序员?
  • 以太坊客户端Geth命令参数详解
  • 原生Ajax
  • 《天龙八部3D》Unity技术方案揭秘
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • # 安徽锐锋科技IDMS系统简介
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (04)odoo视图操作
  • (12)Linux 常见的三种进程状态
  • (12)目标检测_SSD基于pytorch搭建代码
  • (Matlab)使用竞争神经网络实现数据聚类
  • (分布式缓存)Redis持久化
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)Hibernate的二级缓存
  • (区间dp) (经典例题) 石子合并
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)c52学习之旅-流水LED灯
  • .net core 6 集成 elasticsearch 并 使用分词器