: 严格求值:call by value 非严格求值:call by name 惰性求值 定义表达式时不会立即求值,只在第一次调用时才求值 递归函数 函数式编程中没有循环语句,全部的循环用递归实现...("dog") }catch{ case _ => 0 //下划线是通配符,统配所有异常 }finally{ print("总是会打印"); } scala中的macth 类似switch...call by value 对函数实参求值,仅求一次,求得的值直接替换函数中的形式参数 call by value 不会对函数实参进行表达式求值,直接把表达式传入函数体内,替换表达式的形参,然后在函数内每次使用到此形参时会被求值...loop: ()Int scala> bar(1,loop) //loop函数位于的参数的定义方式是y: => Int,即call by name,不进行求值,会带到函数体内并且使用时 才求值,此处...,函数跟普通变量一样使用,且具有函数的相关类型 函数的类型 在scala中,函数类型的格式为 A => B,表示一个:接受参数类型为A的、并返回类型B的函数 eg: Int => String
4,变量 Scala支持两种类型的变量,即常量val和变量var。 常量在程序中不可以被重新指向,变量可以被重新指向新的对象。 声明变量时可以指定类型,也可以由解释器根据初始值自动推断。 ?...(7)->用来指定映射Map中的键值关系。 (8)<-用来指定for表达式的迭代器。 (9)下划线_在Scala中被用作占位符表示匿名函数参数或作为引入package的通配符。...Scala有3中定义类的风格,java风格,简写风格,和case类风格。 简写风格可以在类声明的参数前加上val即表示为类的属性,省去属性的绑定。...简洁范例:强大的自动类型推断,隐含类型转换,匿名函数,case类,字符串插值器。...4,函数式编程 函数的特点是操作无副作用,唯一的作用的生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计的默认数据结构绝大部分是不可变的。
_ => "Other Type" } }} case class模式 构造器模式指的是,直接在case语句后面接类构造器,匹配的内容放置在构造器参数中。...x if(x == 5) => "守卫" //通配符模式 case _ => "通配符" } }} Option匹配 在Scala中Option类型样例类用来表示可能存在或也可能不存在的值...当调用该函数或方法时,scala会尝试在变量作用域中找到一个与指定类型相匹配的使用implicit修饰的对象,即隐式值,注入到函数参数中函数体使用。...那么,自然throw表达式也不例外,throw表达式的返回值为Nothing。由于Nothing类型是所有类型的子类型,因此throw表达式可以出现在任意位置,而不会影响到类型的推断。...当接收参数为Object类型时,scala默认不会转换成java的数值类型,这样当判断对象的具体数值类型时,会出现不认识scala对象类型的异常。
= mulBy(0.5) 5 println(tripe(14) + " " + half(14)) 这就是一个闭包 3、scala中的柯里化 定义:柯⾥化指的是将原来接受两个参数的函数变成新的接受...也就是说,伴生对象可以访问伴生类的私有成员,伴生类也可以访问伴生对象的私有成员。 ...:不需要使用分号作为结束符 java: 每个语句结束后需要分号作为结束符 4、循环 scala:循环语句可以⽤于守卫 java: 不可以这么写 5、通配符: scala:_ ...器名称需要与类名称一样 7、内部类 scala:scala实例化的内部类是不同的,可以使⽤类型投影,例如 Network#Person表示Network的Person类 8、接⼝ java...object是类的单例对象,开发⼈人员⽆需用new关键字实例化。如果对象的名称和类名相同,这个对象就是伴生对象(深⼊了解请参考问题Q7) 13、 case class (样本类)是什么?
scala中所有类的超类,表示任意类型), 注意看函数体 x = match{ case 1 => "one" } 这个就是scala中模式匹配的语法结构, 首先变量.match(选择器) 后面跟着一个花括号...=="two") => 2 case _ => } } 变量匹配,匹的是case语句后面接的是scala变量,如case x if(x == "1") => x等,在使用时一般会加守卫条件...- 构造器模式 构造器模式匹配直接在case语句后面接类构造器,匹配的内容放置在构造器参数中。...与通配符(_)不同的是,Scala把变量绑定在匹配的对象上。...元组模式:匹配元祖 类型模式:匹配变量的类型 Option 类型 Option类型在Scala程序中经常使用,可以将其与Java中可用的null值进行比较,表示null值。
可以通过追加:_*来解决不能接受的问题:sum(2 to 10:_*) 14、过程:没有函数名后面等号的函数称为过程,返回的是Unit. 15、懒加载:lazy val words=初始化表达式 ,该变量只有在使用时才会调用初始化...5、参数推断,当你将一个匿名函数传递给函数或方法时,Scala会尽可能推断类型信息如:valueAtOneQuater((x)=>3*x)函数会推断出x的类型为Double。...在模式匹配时可以将类型为Amount的对象和样例类进行匹配,然后参数会直接绑定然后直接用样例类中的变量如下: amout math{ case Dollar(v)=>"$"+v case...存在类型:就是类似于java中南的通配符?。Scala类型如下图: 6、依赖注入,抽象类型,家族多态,高等类型这里不再累述。 7、type和class的区别:每个对象都有自己不同的type。...2、当对象访问一个不存在的成员时。3、当对象调用某个方法,传入的参数类型不对时。
泛类型 和java一样,Scala也有泛型的概念,在scala里面泛型是使用方括号 [] 来接受类型参数的。通常使用字母A来作为参数标志符,当然你也可以使用其他任意的参数名称。...在类型系统中使用型变允许我们在复杂类型之间建立直观的连接,而缺乏型变则会限制类抽象的重用性。...内部类 内部类就是class里面的class,在java里面,内部类被看成是外部类的成员。但是在scala中内部类是和外部类的对象进行绑定的。...(x: Int) = java.lang.Integer.valueOf(x) Scala 多态方法 Scala中多态是通过类型和值的参数化来实现的。...当调用 多态方法 或实例化 泛型类 时,也不必明确指定类型参数。Scala 编译器将从上下文和实际方法的类型/构造函数参数的类型推断出缺失的类型参数。
例如,在Scala中,一切皆为对象,而在Java中,基本类型、null、静态方法等不是对象。在Scala中,成员变量/属性必须显示初始化,而在Java中可以不初始化。...作为通配符:下划线可以用作通配符,表示匹配任意值。例如,在模式匹配中,可以使用下划线来表示匹配任意值。...例如,case str: String 表示当 value 的类型为 String 时执行该分支,并将其绑定到变量 str。类似地,其他的 case 语句也使用了类型模式匹配来匹配不同的值类型。...如果一个泛型类的类型参数是协变的,那么子类型的关系将保持不变,即父类型可以被替换为子类型。在 Scala 中,可以使用 + 符号来表示协变。...由于 Cage 类是协变的,所以可以将 Cage[Dog] 和 Cage[Cat] 赋值给 Cage[Animal] 类型的参数,而不会产生类型错误。
1.1 导入通配符 *在Scala中是合法的方法名,所以导入包时要使用_代替。....*; //Scala import java.util._ 1.2 类成员默认值 Java中类成员可以不赋初始值,编译器会自动帮你设置一个合适的初始值: class Foo{ //String...null var s: String = _ } 该语法只适用于类成员,而不适用于局部变量。...new String[]{"a", "b"}); 在Java中可以直接将数组传给printArgs方法,但是在Scala中,你必须要明确的告诉编译器,你是想将集合作为一个独立的参数传进去,还是想将集合的元素传进去...如果是后者则要借助下划线: printArgs(List("a", "b"): _*) 1.4 类型通配符 Java的泛型系统有一个通配符类型,例如List<?
是的,在Scala里,你可以放心大胆地使用vals="ABC",而Scala里强大的类型推断和模式匹配,绝对会让你爱不释手。...Java中的类,可以既有静态成员,又有实例成员。...在调用时,我们分别传入求圆周长和圆面积的匿名函数,用于实现calc函数的逻辑。...这在函数式编程中称为柯里化(Curry),柯里化可以把函数定义中原有的一个参数列表转变为接收多个参数列表。在函数式编程中,一个参数列表里含多个参数的函数都是柯里函数,可以柯里化。...此外,Scala的模式匹配还有更多用法,如case类匹配、option类型匹配,同时还能带入变量,匹配各种集合类型。综合运用模式匹配,能够极大提升开发效率。
表达式相关 从表达式开始涉及的知识点会越来越复杂,会涉及到匹配表达式、循环、正则,另外也要关注if……else、值绑定和通配符如何使用。 8 说说你对匹配表达式/模式匹配的理解?什么是模式守卫?...方法是定义在类中的函数,这个类进行实例化后会有一个同名的方法,一般调用方法的做法是使用缀点记法-实例名.方法名(参数……) 12 什么是偏函数?...部分应用函数可以从字面含义进行解释,只使用一个函数的部分功能-只使用部分参数,其他参数的值固定,可以将原函数直接调用,然后对于需要固定的参数,直接在参数中输入相应的值,需要变化的参数使用“_”,需要注意的是通配符要指定类型...Option类型表示一个值的存在与否,一般在程序中需要返回一个空对象的时候,使用Option类型,如果返回null,程序会引起异常,而Option就不会。...有区别的,不加关键字的话,这个参数只能用于类的实例化,一旦实例化后这些参数就不可以使用了,如果加关键字的话这些参数就成为类中的一个字段。 30 case class(样本类)是什么?
在上面的例子中,我们并没有显示使用x:Int的形式,这是因为编译器可以通过类型推断推断出x的类型,对其更简化的形式是: val salaries = Seq(20000, 70000, 40000)...val newSalaries = salaries.map(_ * 2) Scala 既然Scala编译器已经知道了参数的类型(一个单独的Int),你可以只给出函数的右半部分,不过需要使用_代替参数名...scala的类型推断,我们可以让代码更加简洁: numbers.foldLeft(0)(_ + _) Scala 样例类 case class主要用于不可变的数据。...伴生对象 伴生对象是指与某个类名相同的单例对象,类和它的伴生对象可以互相访问其私有成员。...注意:类和它的伴生对象必须定义在同一个源文件里。 正则表达式模式 在Scala中,可以使用.r方法将任意字符串变成一个正则表达式。
switch支持值绑定,在case语句中声明变量或常量,其值绑定为状态码的值。switch绑定值可以配合where语句使用,能额外检查一些条件,这个特性可以创建动态筛选条件。...7、if-case 语法 为只有一个分支的switch语句提供优雅的替代品。 8、区间既可在switch语句中匹配使用,也可以在for-in循环中使用。...9、通配符_既可以在switch语句使用,也可以在for-in语句中替代迭代器,这样就可以忽略迭代器。...元组也可以作为函数参数 6、闭包就是objc中的Block 闭包语法: {(参数)->返回类型 in //代码 } 闭包可以利用swift的类型推断系统去除参数和返回值的类型信息来简化闭包。...与结构体不同,类没有默认的成员初始化方法。 在方法实现中,属性如果遇到同名参数才需要指定self,不然则不需要。 在初始化方法中允许给常量赋值,其它方法则不允许。
语言特点如下: (1)Scala和Java一样属于JVM语言,使用时都需要先编译为class字节码文件,并且Scala能够直接调用Java的类库。...那么调用时,小括号,可加可不加(声明无括号调用时也没有括号) 如果方法没有参数列表,那么小括号可以省略,调用时小括号必须省略 // 1、return可以省略,Scala会使用方法体的最后一行代码作为返回值...- _ // 2、参数必须只使用一次,使用的顺序必要和定义的顺序一直 val f9: (Int, Int) => Int = -_ + _ 6、函数柯里化&闭包 **函数柯里化:**将一个接收多个参数的函数转化成一个接受一个参数的函数过程...var修饰参数:作为类的成员属性使用,可以修改。 val修饰参数:作为类只读属性使用,不能修改。...class与object在同一个文件中。 如果满足上两个条件,那么就称这个object为class的伴生对象,称class为object的伴生类。 伴生类与伴生对象可以互相访问对方的私有成员。
//若定义的时候不加(), 调用时也不能加() 注意:方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归方法,必须指定返回类型 (*)如何定义一个函数 ...res17: Int = 6 #将sum写成柯里化的sum,前面方法使用一个参数列表,“柯里化”把方法或者函数定义成多个参数列表(且第一个参数只有一个参数,剩余的参数可以放在一个参数列表中...的高级内容:泛型 (*)泛型类 泛型类(类声明时类名后面括号中即为类型参数),顾名思义,其实就是在类的声明中,定义一些泛型类型,然后在类内部,比如field、method,就可以使用这些泛型类型... 使用泛型类,通常需要对类中某些成员,比如某些field或者method的参数或变量,进行统一的类型限制,这样可以保证程序更好健壮性和稳定性 如果不适用泛型进行统一的类型限制...:(泛型变量的值可以是本身或者其父类的类型)在类或者特征的定义中,在类型参数之前加上一个-符号,就可以定义逆变泛型类和特征了 参考ContravanceDemo代码
领取专属 10元无门槛券
手把手带您无忧上云