《scala 编程(第3版)》学习笔记5

【图文详细 】Scala编程语言——什么是Scala 总结: 我对自己的要求是终身学习和每天保持迅速的进步,小老弟如果觉得看着还可以,我也不要你的赞和双击666,欢迎来看我定时更新的博客Scala汇总,并定时向您汇报最新的Scala内容:https://blog.youkuaiyun.com/qq_42246689/article/details/85073380 1、Scala 概述  1.1、什么是 Scala  Scala 官网:https://ww... 阅读详情

第16章 使用列表

  1. scala的类型推断算法P336-P339:
    • 对于实例m的方法调用m(args),首先检查m的类型是否已知。如果类型已知,那么这个类型就用于推断入参的预期类型。例如,l1.sortWith(_>_),l1为List[Char],入参类型可推导为 (Char,Char)=>Boolean。
    • 对于函数直接调用,如msort(_>_)(l1)。
      • 方法首先会看方法的类型参数是否传递了,如果传递了(如msort[Char](_>_)(l1)),则可用Char直接推断后面的入参类型。
      • 如果没有传递方法的类型参数,则会检查入参的类型决定反复的正确实例类型。如msort(_:Char>_:Char)(l1)或msort2(l1)(_>_)。
      • 由上例子可知,scala的类型推断,对于柯里化的函数,会只考虑第一个函数参数列表里的所有入参类型,不会管后面函数的入参。所以建议将函数类型的入参放到最后,如msort2中的less放在最后。
val l1=List('a','b','c','d','e')

def msort[T](less:(T,T)=>Boolean)(xs:List[T]):List[T]={
	...
}//msort[T]中的T一旦确定,后面所有入参的类型就确定了

//交换顺序
def msort2[T](xs:List[T])(less:(T,T)=>Boolean):List[T]={
	...
}
  1. 所以可以理解 class C[T] 和 def func[T]处的类型参数T是用来帮助类型推断的,看情况可写可不写。

第19章 类型参数化

  1. 类型参数化能让我们编写泛型的类和特质。例如:Set[T]的具体实例可以是Set[String],Set[Int]。P385
  2. 推论:不带类型参数的类和特质,可以直接做类型参数。如下面的C2和常见的String,Int等。P392
class C1[T](val l1:List[T])//trait C1[T](val l1:List[T]) 也一样
class C2(val l1:List[String])//trait C2(val l1:List[String]) 也一样

//做类型参数
val c2:C2=...
val c1:C1=.. (报错)

val c1:C1[String]=..
val c1:C1[Int]=..
  1. 带类型参数的类或特质又叫泛型。给定类型参数后,就可当做类型参数了。例如 C1[String],C1[Int]。有几个概念:
    • 协变(convariant):如果S是T的子类型,则C1[S]也是C1[T]的子类型,则称C1在类型参数T上是协变的。通过定义时再T前面加上+实现。class C1[+T]。P393
    • 不变(nonvariant):不同类型的队列之间永远不存在子类型关系。泛型默认是不变的。 P394
    • 逆变(contravariance):如果S是T的子类型,则C1[T]是C1[S]的子类型。通过定义时再T前面加上-实现。class C1[-T]。P394
    • +,-叫做型变注解(variance annotation)。
    • 协变,不变,逆变叫做类型参数的型变(variance)。
  2. 型变的作用在于,可以方便的使用scala的特性:子类的值可以被用在任何需要超类的值的地方(即子类可以当做超类使用,这也是里氏替换原则)。P186
    • 对于协变来说,如果S是T的子类型,可用C1[T]的地方,就能用C1[S],例:String是Any的子类,可用C1[Any]的地方,就能用C1[String]
    • 对于逆变来说,如果S是T的子类型,可用C1[S]的地方,就能用C1[T],例:String是Any的子类,可用C1[String]的地方,就能用C1[Any]
  3. Scala中数组是不变的,但可以通过类型转换,实现需要协变时的场景。P397
val a1=Array("abc")
val a2:Array[Any]=a1 //报错
val a2:Array[Any]=a1.asInstanceOf[Array[Any]] //成功

  1. 所有需要类型参数的地方,都被认为是一个“点”,这些点可分为协变点、逆变点、不变点。P399

    • 用+注解的类型参数只能用在协变点。
    • 用-注解的类型参数只能用在逆变点。
    • 不用注解的类型参数,可以用再任意点。(也是唯一能用在不变点的类型参数)
  2. 怎么确认点位类型?参考基本原理,如下是一些快速确认方法:

    • 方法参数的位置和值参数的位置都是逆变点。如def func[T](a:S)中的T和S处。
    • 方法返回值的位置是协变点。如def func[T](a:S):Q={}中的Q处。
    • FunctionN有N+1个参数,前N个都是逆变点,最后一个是协变点。
  3. scala中函数参数的一个非常重要的结论:函数的参数必须是逆变的,而返回值必须是协变的

  4. 当我们写下函数类型A=>B,scala会展开成Function1[A,B],Function1是逆变和协变同时存在的。P403

    • 我们在使用函数类型参数的时候,会默认带上逆变和协变在里面,有比较有趣的应用,见如下示例 P404
trait Function1[-S,+T]{
	def apply(x:S):T
}

// 函数类型参数默认带上逆变和协变
def func1(f:A1=>Any)={}
// 等价于
def func1(f:Function1[-A1,+Any])={}

// 假如A1为A的子类,String是Any的子类,则 A=>String 就为 A1=>Any的子类
def f1(a:A1):Any={}
def f2(a:A):String={}

func(f1) //成立
func(f2) //也成立,里氏替换规则

  1. 下界:逆变点位置是不能使用协变参数的,要想解决这个问题,可通过下界方案。在逆变点用[U>:T]的U类型表示。这个语法表示U必须是T的超类。P401
    • 举例,假定有一个Fruit类和两个子类Apple、Orange,且func的功能是新增元素。则按照C1的新定义,可以对C1[Apple]追加一个Orange,返回一个C1[Fruit]。P401
class C1[+T]{
	def func(x:T):C1[T]={..} //报错,x处为逆变点,不能用协变参数
}

//修改
class C1[+T]{
	def func[U>:T](x:U):C1[U]={..} //不报错
}
  1. 上界。[T<:U]`表示T有个上界U,即U必须是T的超类。理解为下界的一种相反的写法即可。P409
  2. private[this]和protect[this]可以使scala跳过型变检查,而且这种跳过检查不会造成问题,因为型变只会在运行或者编译时对象类型改变发生,如果对象的字段是private或者protect的,这种情况就不会发生。具体原因可参考:参考1,参考2。P407

第20章 抽象成员

  1. 抽象trait可以不加abstract 限定字。
    • 抽象的val不能再重新定义成def 或var
    • 抽象的def可重新定义成val
trait Abstract{
	type T
	def transform(x:T):T
	val initial:T
	var current:T
}

class Concrete extends Abstract {
  type T = String //相当于给String一个别名
  def transform(x: T)= x +x
  val initial = "hi"
  var current = initial
}

abstract class B extends Abstract{
 val transform:T //可以,抽象的def可重新定义成val
 def initial:T //报错,抽象的val不能再重新定义成def 或var-=
}

  1. 抽象类/特质第具体化的新语法:使用匿名类。 解释a的创建过程:
      1. Abs的初始化代码被执行,抽象字段都初始化为对应类型的默认值。
      • 容易得到错误结果
      • Abs(exp1,exp2)这样第初始化会先计算exp1和exp2的结果,new Abs{val v=exp1,m=exp2}初始化匿名类过程不会先计算exp1和exp2。
      1. 由new表达式定义的匿名子类的主构造方法给执行。包括用1初始化v和用4初始化m。
      1. 解释器调用被构造对象第toString方法,以便打印出结果
      1. toString方法从头到尾依次访问对象字段。(如果有lazy字段,则lazy字段在被访问时开始被求值)
abstract class Abs { //或trait Abs
  val v:Int
  val m:Int
}

val a = new Abs{ //
  val v=1
  val m=4
}//这里中间过程产生了一个匿名类

println(a.v) //输出1


val x=2
val b = new Abs{ //
  val v=1*x //初始化匿名类过程不会先计算表达式
  val m=4*x//初始化匿名类过程不会先计算表达式
}
println(b.v) //输出0
  1. new Abs{val v=exp1,m=exp2}解决这类产生默认值第问题:P417
//预初始化字段
val c = new { //
  val v=1*x //初始化匿名类过程 先计算表达式
  val m=4*x//初始化匿名类过程 先计算表达式
} with Abs

// lazy的val
abstract class Abs2 { //或trait Abs2
  lazy val v:Int
  laze val m:Int
  val t=v+m
}
  1. 抽象类型可定义上下界 P424
class Food
abstract class Animal{
	type SFood <:Food
	def eat(food:SFood)
}
//等价
abstract class Animal{
	def eat[SFood <:Food](food:SFood)
}
  1. 枚举。P429
    • Enumeration类中有Value函数
object Color extends Enumeration{
  val Red = Value //Value函数创建 new Val(nextId,nextNameOrNull) 对象,Val 对象 继承自和Value函数同名的Value类
  val Green = Value
  val Blue = Value("Blue")//带参数第方法可以给枚举值关联特定名字
  // 或直接一行 val Red, Green, Blue= Value
}
for(a<- Color.values) print(a +" ") //Red Green Blue
println(Color.Blue.id)//2
println(Color(2))//Blue

第21章 隐式转换和隐式参数

  1. 会发生隐式换的三种情况:P448
    • 转换到一个预期类型:当编译器看到一个X,单需要一个Y时。就会查找一个能将X转化成Y的隐式转换。
    • 对某个(成员)选择接收端(即字段、方法调用等)。obj.doIt,如果obj没有doId这个成员,那么编译器再放弃前,会尝试将obj转换成有doIt成员的类型。这里obj就是接收端。
      • 隐式类:以implicit打头的class,编译器会自动生成一个从类的构造方法参数到类本身的隐式转换。
        • 隐式类必须存在于另一个对象、特征或类里面
        • 隐式类不能是样例类,并且其构造方法必须有且仅有一个参数。
        • 隐式类一般作为富包装类给某个已有的类添加方法。
    • 隐式参数:someCall(a)替换成someCall(a)(b) 或 new A(a)替换成 new A(a)(b)。P454
      • 提供整个最后一组柯里化的参数列表
      • 传入的参数b需要在定义时标记位implicit。且需要在当前作用域内定义或者import。定义需要在调用之前。
        • 隐式object等价于隐式变量或隐式方法。 更多参考:https://stackoverflow.com/questions/22592456/what-are-implicit-objects
      • 调用的方法someCall和A的最后一个参数列表页需要标记位implicit
//预期类型
implicit def doubleToInt(x:Double) = x.toInt
val i:Int=3.5 //可行,调用doubleToInt(3.5)


// 转换接收端
implicit def intToRtational(x:Int)= new Rational(x,1) 

1+ new Rational(1,2)//就不会报错了,因为1先转换成Rational(1,1)


//隐式类
case class Rec(w:Int, h:Int)

object App2 extends App {
  implicit class RecMaker(w:Int){
    def x(h:Int)=Rec(w,h)
  }
  //编译器自动生成如下转换
  //implicit def RecMacker(w:Int)=new RecMaker(w)
  val a= 3 x 4 //就不会报错了,3会转换成new RecMaker(3)
  println(a)//输出Rec(3,4)
}

//隐式参数
case class B(prefer:String)
case class C(prefer:String)

object A{
  def greet(name:String)(implicit job:B,drink:C)={//注意:implicit是针对整个参数列表
    println("欢迎"+name+", 系统已ok")
    println(job.prefer)
  }
}

object App2 extends App {
  val b=B("bbb")
  val c=C("ccc")
  A.greet("张三")(b,c) //显示调用ok
  A.greet("张三")//报错
  implicit val b1=B("b111") //隐式定义
  implicit val c1=C("c111") //隐式定义
  A.greet("张三")//不报错
}


//关于隐式object
object NumberLike {
	implicit object NumberLikeDouble extends NumberLike[Double]{...}
	//等价1
	//implicit val NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...}
	//等价2
	//implicit def NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...}
}

//隐式object的使用
import NumberLike
def sum[A](x: A, y: A)(implicit nl: NumberLike[A]) = nl.plus(x, y)
sum(4.0, 5.0)   // 找到了NumberLikeDouble
  1. 隐式转换的规则约束
    • 标记规则:只有标记位implicit的定义才可用。implicit可以标记任何变量、函数或对象定义。P445
    • 作用域规则:被插入的隐式转换必须是当前作用域的单个标识符。只能convert(x),不能a.convert(x)
      • 单个标识符的例外:跟隐式转换的源类型或者目标类型有关联。把A对象传递给接收B的对象,源类型就是A,目标类型就是B。使用见下面的例子。P446
    • 每次一个规则:只会convert(x)不会convert1(convert2(x)) P447
    • 显示优先规则:只要代码能按编写的样子通过检查,就不会尝试隐式定义。P447
//单标识符例外
object A{
	implicit def aToB(x:A):B=...
}
class A{...}

val b:B=new A //这里会自动调用A.aToB,不需要再程序中单独引入这个转化

  1. 关于隐式参数中使用的Odering[T],哪里引入的类似implicit val odr=new Ordering[T]这样的变量的呢?
    • scala默认引入三个包:java.lang._,scala._,scala.Predef._ ,implicit val odr=new Ordering[T]在scala._中引入,scala.math.Ordering的implicit object中,并且利用了单个标识符的例外规则。
    • 只要理解,假定有implicit val odr=new Ordering[T]这样的变量引入了即可。基本类型的T都满足。
object App2 extends App {
  def maxList[T](l:List[T])(implicit odering:Ordering[T]):T= l match {
    case List()=> throw new IllegalArgumentException("空列表")
    case List(x) => x
    case x::rest=>
      val maxRest=maxList(rest)//这里会隐式添加ordering
      if(odering.gteq(x,maxRest)) x else maxRest //这里依然显示给出odering,可通过上下文界定省略
  }
  val l=List(3,8,5)
  println(maxList(l))//实际调用的是scala.this.Predef.println(App2.this.maxList[Int](App2.this.l)(math.this.Ordering.Int))
}
  1. 上下文界定。[T:Ordering]这样的语法,是一个上下文界定的语法,相当于可省略了(implicit anyName:Ordering[T]) P460
    • [T:Ordering]引入一个参数类型T
    • [T:Ordering]自动添加了一个类型为Ordering[T]的隐式参数
    • 对比上界,下界 [T<:Ordered[T]], [T>:Ordered[T]]表示的继承关系, [T:Ordering]仅表示T带有某种形式的Ordering
//标准库中定义如下方法
def implicityly[T](implicit t:T)=t
//使用上下文界定
object App2 extends App {
  def maxList[T](l:List[T])(implicit odering:Ordering[T]):T= l match {//可以看到ordering并不是必须的,可修改为等价的上下文界定形式
    case List()=> throw new IllegalArgumentException("空列表")
    case List(x) => x
    case x::rest=>
      val maxRest=maxList(rest)//这里会隐式添加ordering
      if(implicityly[Ordering[T]].gteq(x,maxRest)) x else maxRest //标准库中的方法
  }
}
//等价上下文界定
object App2 extends App {
  def maxList[T: Ordering](l:List[T]):T= l match {//等价的上下文界定形式
    case List()=> throw new IllegalArgumentException("空列表")
    case List(x) => x
    case x::rest=>
      val maxRest=maxList(rest)//这里会隐式添加隐式参数 anyName
      if(implicityly[Ordering[T]].gteq(x,maxRest)) x else maxRest //标准库中的方法
  }
}
  1. 多个转换可选时。P464

    • 大部分场合会报错
    • 如果某个转换比其他的更具体,则用这个更具体的。以下任意一条满足,则表示a更具体。没有更具体的时,就报错。
      • a的入参是b入参的子类型 a(x:String),b(x:Any)
      • a、b都是方法,且a所在的类扩展自b所在的类,A extends B,A.a和B.b
  2. 隐式类的调试方法。P466

    • 显示写出
    • scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例
掌握Scala编程:《快学Scala第二版》全面指南 Scala,作为一门集成了面向对象编程和函数式编程特性的多范式编程语言,自其诞生之初就吸引了大量的关注。本章将带你进入Scala的世界,从基础语法开始,逐步深入,帮助你搭建起对这门语言的理解框架。类型推断是指编译器根据上下文自动推断出变量或表达式的类型。在Scala中,几乎所有的类型声明都可以省略,编译器能够根据变量的初始赋值推断出其类型。这种方式不仅减少了代码的冗余,还能使代码更加简洁明了。类型推断的重要性在于它促进了更灵活的编程实践,提升了开发效率,并且使得代码更加易于维护和重构。 阅读详情

相关推荐

《scala编程》第3版英文版&第3版源码

资源包含《Scala编程》第3版英文版和第3版源代码,Scala编程第3版,目前是最新版,支持Scala 2.11以上。《Scala编程》是Scala语言的创始人参与编写的,涵盖的语法特性非常全面,并且作者解释了为什么这么设计,有怎样的考虑,开发者应该以什么样的方式使用。 因此学习这本书,不单单是学会了scala语言本身,更重要的是扩展了视野,提升了思维能力和培养了考虑问题的思维方式方法。

《scala 编程(第3版)》学习笔记1

第1章-第6章

Code_LT的博客 555

scala程序设计第三版

scala程序设计 最新版 高清,详细介绍了隐式转换、模式匹配、集合、线程和并发等

豆瓣9.6分,Scala编程圣经第5版隆重来袭

要说Scala编程界的圣经,那必须是这本蜚声世界的、由Scala 语言缔造者Martin Odersky编写的—— 《Scala编程》 Programming in Scala 本书全面涵盖了整个编程语言、重要类库及其背后理念,全面且强大,是Scala领域当之无愧的王者之作! 本书上市14年来,紧跟语言版本持续迭代,不断以豆瓣评分8.9、9.2、9.4的成绩刷新着领域的天花板! 其中第三版的中文版更是以9.6高分傲视群雄。 第四版的中文版也收到不少读者的好评! 如今,这部长青经典之作又迎来了一次重大

博文视点(北京)官方博客 3万+

Scala 编程英文第三版;Programming in Scala, 3rd edition

Scala 之父第三版作品,英文版,写得比较深入浅出,强烈推荐!

Programming in Scala 3rd 第3版 pdf 0分

Programming in Scala 3rd 英文pdf

Scala 的学习笔记

Scala 是 Scalable Language 的简写,是一门多范式的编程语言。Scala 是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。Scala 也是一种函数式语言,其函数也能当成值来使用。Scala 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。

weixin_45866849的博客 4738

scala编程指南第三版

spark,scala编程指南第三版,非常好的资料,高清无水印

Scala学习笔记:Scala编程进阶

Scala函数式编程、Scala中的集合、Scala高级特性

lrxcmwy2的博客 2480

【实战】ESP32 + LN298N 实现电动推杆的闭环位置伺服控制

本文详细介绍了如何使用ESP32微控制器和LN298N电机驱动模块,为普通电动推杆增加编码器反馈,实现精准的闭环位置伺服控制。文章从硬件选型与接线讲起,深入解析了编码器四倍频计数原理与位置换算,并重点阐述了PID控制算法的核心思想、代码实现及参数整定方法,旨在帮助读者从零构建一个反应迅速、定位精准的智能执行器系统。

weixin_29195615的博客 318

DeepSeek+Coze扣子搭建智能体(保姆级教程)

DeepSeek+Coze扣子搭建智能体(保姆级教程)

yizhen91y的博客 1万+

scala基础教程:《scala 编程(第3版)》学习笔记(全)

当作一个无参函数使用。说明这点的作用是在做scala测试的时候,ScalaTest框架,会把测试代码当作无参函数传入test函数中。这样也利用了传名函数不会马上计算结果的特征。所有需要类型参数的地方,都被认为是一个“点”,这些点可分为协变点、逆变点、不变点。由于函数和字段在同一个命名空间,所以可以把无参函数和字段相互替换使用。,Function1是逆变和协变同时存在的。本章相当于15章 的进阶版本,所以放在这里先讲。(第10章 组合和继承 会有更多详细的介绍)本章主要讨论不可变对象。new 类名(参数)

Code_LT的博客 1015

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 393

Scala编程基础

目录 一 Scala概述 1.1 什么是scala 1.2 为什么要学scala 1.3 Spark函数式编程初体验 二 Scala开发环境 2.1 安装JDK 2.2 安装Scala 2.2.1 Windows安装Scala编译器 2.2.2 Linux中安装Scala编译器 2.3 IDEA安装 2.4 Scala插件离线安装 2.5 IDEA创建Scala工程 ...

我的祖传代码 3813

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1593

2、实时DSP编程技术及其应用

本文详细介绍了实时数字信号处理(DSP)技术及其应用,涵盖三种流行的浮点DSP处理器系列的特点、开发工具和优化方法。通过具体的应用实例,如语音压缩、音乐信号处理和雷达信号处理,展示了如何在实际项目中应用这些技术,帮助工程师提高系统的性能和可靠性。

cicd6pipeline的博客 840

spark编程基础python版 pdf_《Spark编程基础(Scala版)》.PDF

《Spark编程基础(Scala版)》.PDF《Spark编程基础(Scala版)》教材官网:/post/spark/温馨提示:编辑幻灯片母版,可以修改每页PPT的厦大校徽和底部文字《Spark编程基础(Scala版)》课程介绍(PPT版本号:2018年春季学期)林子雨厦门大学计算机科学系扫一扫访问教材官网 E-mail: ziyulin@主页:/...

weixin_39936792的博客 3702

实用指南:制作通用的INCA和CANape兼容A2L文件

A2L(ASAM MCD-2 Measurement and Calibration Data)文件是描述ECU(电子控制单元)测量和校准数据的标准文件格式。在标定工作中,A2L文件扮演着极为重要的角色,它定义了测量通道、校准参数等关键信息,为工程师提供了统一的描述方式。INCA和CANape是两种常见的汽车电子系统标定工具,分别由ETAS和Vector公司开发。它们在汽车电子系统的开发和调试过程中发挥着重要作用,提供了丰富的标定功能和用户友好的界面。

一直在水些技术小文 2924

Scala编程语言

Scala是一门多范式编程语法,所谓多范式指的就是多种编程风格的语法,Scala主要是一门面向对象编程语言和函数式编程语言。

IT小小白的博客 7100

FPGA实现的AES加解密算法——Verilog源代码详解

本文将介绍基于FPGA的AES加解密算法的Verilog实现,并提供相应的源代码。根据密钥长度的不同,AES算法分为AES-128、AES-192和AES-256三种模式。对于已知的明文-密钥组合,可以使用在线的AES加解密工具计算出正确的密文,然后将该密文与FPGA加速器的输出进行比较。本文以AES-128算法为例,介绍基于FPGA的AES加解密算法的设计思路和Verilog实现。以上是基于FPGA的AES加解密算法的Verilog实现的相关内容。模块接受输入的明文和密钥,并输出加密后的密文。

HackSquad的博客 1977

ncode控件使用总结

数据格式txt转s3t #HEADER #TITLES Absolute_Time,COG_Ax,COG_Ay,COG_Az,LF_SPINDLE_AZ #UNITS ,g,g,g,g, #DATATYPES Double,Float,Float,Float,Float #DATA 2. 导入s3t数据 3. 输入数据控件 直接拖入数据源或者添加控件数据 4.

技术联盟 2006

Scala学习笔记

lambda表达式: 就等用于scala中匿名函数,使用函数式接口时,我们对函数式接口的简化操作,使用函数式接口大部分场景下都是使用匿名内部类的形式实现的,匿名内部类最核心的就是重写函数式接口的唯一的抽象方法把lambda就是简化匿名内部类的操作的。,Scala函数当中,形参是可以赋予默认值的,一旦形参赋予默认值,那么调用参数的时候,带有默认值的形参就可以不用传递参数了,带有默认值的形参一般要求放到形参列表的最后,如果没有放到最后,那么调用的时候,给其他形参传递参数,需要带有参数名传递。

cai_4的博客 666

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

scala学习笔记——转载

分享一份B站教学视频的原笔记 传送门:Scala快速入门(适合为学Spark学习Scala的同学) 原版word文档下载:https://download.youkuaiyun.com/download/Yang_Ke_Di/33023205 以下为源文档内容 Scala 学习目标 1.能够安装上scala必备的开发工具IDEA 2.了解学习scala的必要性 3.了解函数式编程的特点 4.掌握scala编程基础 学习建议: 每一个例子都要手动去敲 Scala介绍 Scala是一种针对JV

Yang_Ke_Di的博客 2875

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Scala编程基础((超级详细版)

Scala编程基础

2301_77836489的博客 1564

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Scala】Scala的作业3----Scala学习笔记

东北大学软件学院大数据班 1.读下图的程序,将其改为高阶函数的形式 。 2.用correspond方法让我们判断某个字符串数组里面所有元素的长度是否和某个给定的整数数组一致 3.假设某国的货币有若干面值,现给一张大面值的货币要兑换成零钱,问有多少种兑换方式。用尾递归实现。 4.写一个递归函数,来获取第n个斐波那契数,前两个斐波那契数0 和 1,第n个数总是等于前两个数的和——序列开始为0,1,1,2,3,5.请定义尾递归函数 def fib(n: Int): Int 5.定义一个操作符+%,

子浩的博客 1万+

Scala 3示例项目推荐

Scala 3示例项目推荐 项目基础介绍和主要编程语言 Scala 3示例项目是一个由Scala社区维护的开源项目,旨在展示如何使用Scala 3(Dotty)编写和构建Scala应用程序。该项目的主要编程语言是Scala,这是一种结合了面向对象编程和函数式编程特性的高级编程语言。Scala 3是Scala语言的最新版本,引入了许多新特性和改进,以提高开发效率和代码质量。 项目核心功能 Scala...

gitblog_00490的博客 1033
上一篇: Scala中Option的使用
下一篇: scala基础教程:《scala 编程(第3版)》学习笔记(全)
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值