成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...
写在前面: 我是
「nicedays」
,一枚喜爱做特效,听音乐,分享技术的大数据开发猿
。这名字是来自world order乐队的一首HAVE A NICE DAY
。如今,走到现在很多坎坷和不顺,如今终于明白nice day是需要自己赋予的。白驹过隙,时光荏苒,珍惜当下~~
写博客一方面是对自己学习的一点点总结及记录
,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对大数据与机器学习
感兴趣,可以关注我的动态https://blog.csdn.net/qq_35050438
,让我们一起挖掘数据与人工智能的价值~
文章目录
Scala特性:
函数式编程:
一:懒值:
二:闭包(closure):
三:柯里化:
四:隐式参数:
五:隐式转换:
六:_常用场景:
七:偏函数:
OOP式编程:
一:类:
二:内部类:
三:样例类(case class)--实体类
四:枚举类:
五:泛型类:
六:类型边界:
类型上界:
类型下界:
七:型变:
八:get/set:
九:单例对象:
十:伴生对象:
十一:trait特征--接口+抽象类
十二:动态混入:
十三:scala创建对象有几种方式:
十四:叠加特质:
十五:扩展特质:
Scala特性:
函数式编程:
一:懒值:
初始化推迟,第一次调用变量时才会被初始化
// lazy val word = scala.id.Source.fromFile("").mkString
解决初始化开销很大的语句
二:闭包(closure):
肉眼看到效果:
在函数内部可以访问到函数体外的变量或者是其他函数的变量
实际操作:
将函数能访问的变量(如果这个变量是其他函数的,它会复制一份出来)和这个函数都封装成了只有一个方法的对象
最后导致效果:
看上去让两个函数都可以拥有相同的变量名,但是操作变量时,双方互不影响
三:柯里化:
把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术
其实这很好理解,柯里化的本质就是揭示了任何函数哪怕是多参数的,都可以转化成单参数的函数叠加。
def定义柯里化方法
# 实现过程def mulOne(x: Int) = { (y: Int) => x * y }
def mulOne(x: Int) = (y: Int) => x * y
def mulOne(x: Int)(y: Int) = x * y//方法类型 mulOne: (x: Int)(y: Int) Int
val定义函数时
// val 可以定义匿名函数,这下面相当于嵌套了两层匿名函数val mulOne = (x: Int) => (y: Int) => x * y// 函数类型:Int => (Int => Int)
四:隐式参数:
标记一个implicit的参数列表
def sum(score: Int)(implicit y:Int): Int
五:隐式转换:
隐式转换触发机制:
当表达式的类型与预期的类型不同时
当对象访问一个不存在的成员
当对象调用某个方法,而方法的参数声明与传入参数不匹配时
六:_常用场景:
模式匹配
导包中的所有类
函数赋值
// medef fun = { println("call")}val v = fun // 调用函数funval f = fun _ // 将函数fun赋值给f
七:偏函数:
在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择。
将包在大括号内的一组case语句封装为函数,我们称为偏函数
偏函数是一个特质PatrialFunction
具体形式:
val fun1 = new PartialFunction[Any: Int] { // 当返回真,就去调用apply,构建对象实例,假就不调用 override def isDefinedAt(x: Any) = { println("x=" + x) x.isInstanceOf[Int] }
override def apply(v1: Any) = { v1.asInstanceOf[Int] + 1 }}
简写形式:
val fun1: PartialFunction[Any: Int] { case i: Int => i + 1}// 再简化val list3 = list.collect{case i: Int => i + 1}// 写多行也没有问题
collect调用:
list.collect(fun1)
OOP式编程:
一:类:
scala 类中无法定义静态成员变量和方法
构造器
主构造器
辅助构造器
成员变量与方法
类的实例化
二:内部类:
一个类可以作为另一个类的成员
java内部类是外部类的成员
scala内部类绑定到外部类的对象实例
给自己用的,用来新建对象
三:样例类(case class)—实体类
用于描述不可变的值对象
样例类构造参数为val,自动实现类构造参数的getter
样例类构造参数为var,自动实现类构造参数的setter和getter
自动创建伴生对象
自动实现其他方法
toString,equals,copy, hashcode,
伴生对象的apply和unapply
四:枚举类:
object Weekday extends Enumeration { //枚举值从0开始计数 val Mon,Tue,Wed,Thu,Fri,Sat,Sun=Value}
五:泛型类:
泛型类指可以接受类型参数的类,泛型类在集合类中被广泛使用
class Stack[T] { var elements: List[T] = Nil def push(x: T) { elements = x :: elements } def top: T = elements.head def pop() { var t = elements.head elements = elements.tail t } def showElements(){ elements.foreach(x=>print(s"$x "));println()} }
六:类型边界:
类型上界:
T<:a>子类
类型下界:
T>:A 表示类型变量T应该是类型A的超类
七:型变:
java对于协变的一致性问题可以用 ? extends T 来解决
协变
类似于<:>
对于两种类型 A 和 B,如果 A 是 B 的子类型,那么 Foo[A] 就是 Foo[B] 的子类型
class Foo[+T] // 协变类
逆变
对于两种类型 A 和 B,如果 A 是 B 的子类型,那么 Bar[B] 就是 Bar[A] 的子类型
class Bar[-T] // 逆变类
不变
默认情况下,Scala中的泛型类是不变的
class Baz[+T] //不协变类
八:get/set:
scala自动生成get/set方法
var _name: String = _
当需要自定义时.自己重写的get /set 方法
class Person {
private[this] var _name: String = _
def name: String = _name
def name_=(value: String): Unit = _name = value
}
加注解自动生成兼容java的get/set方法
@BeanProperty var name: Int = _
九:单例对象:
scala类中无法定义静态成员,object来表示静态成员和方法
十:伴生对象:
当你的类需要用到你的对象时,即用到既有实例方法又有静态方法的类.通常我们使用伴生对象完成
伴生类与伴生对象可互相访问各自私有成员
伴生对象可为伴生类增加静态成员
// 伴生类class Account(n: Int) { val id = Account.newUniqueNumber()}// 伴生对象object Account { // 用伴生对象来代替new def apply(n: Int): Account = new Account(n: Int); private var lastNumber = 0 private def newUniqueNumber = lastNumber += 1}// apply方法名默认可以不用写Account(5)
十一:trait特征—接口+抽象类
多个类具有相同的特征1时,就可以将这个特征独立出来,采用关键字trait来声明。
java中的接口都可以当作特质来使用。
特质本质还是用了java的抽象类来完成了方法的具体实现,在反编译过程中会发现,特质会去生成一个【特质名$class.class】的一个抽象类和一个【特质名】的接口,抽象类会去实现该接口的方法,
十二:动态混入:
b和c如果 都应用了某特质,b去实现了该特质的某种方法,c并不会收到影响,完成了解耦而java接口会因为传递性,c会有b实现的方法。
var xxx = new Operate with OperateTrait// 构建对象时混入的特质,对象可以使用特质的方法
十三:scala创建对象有几种方式:
new 对象
apply 创建
匿名子类方式
动态混入
十四:叠加特质:
构建对象的同时混入多个特质,称为叠加特质
那么特质声明顺序从左到右,方法执行顺序从右到左
菱形结构相同父类
十五:扩展特质:
特质继承类来扩展实现一些类的功能
成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...相关推荐
- python可变类型做默认参数
python可变类型做默认参数 下面代码的输出结果是什么 def extendlist(val, list=[]):list.append(val)return listlist1 = extendl ...
- C++57个入门知识点_40 常成员函数(用于定义不可修改类内部成员变量的函数,一般用来修饰Get函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)
前面我们已经学习了C++中重要的知识点,特别是虚函数可能会有些懵逼,但是需要我们在实践中不断的理解和尝试,写代码是进步最快的方式,接下来将会介绍一些简单但很重要的知识点,本篇介绍常成员函数. 总结: ...
- php 函数静态变量,php 函数中静态变量使用的问题实例分析
本文实例讲述了php 函数中静态变量使用的问题.分享给大家供大家参考,具体如下: function msg() { static $a = 0; echo $a++, ' '; } msg(); ms ...
- C++PrimerPlus 学习笔记 | 第八章 函数探幽 |3.默认参数 4.函数重载
默认参数 默认参数是指当函数调用的时候省略了实参自动使用的一个值. // 函数原型 void wow(int n = 1); // 如果这样调用函数等价于 wow(1) wow() // == wow ...
- python函数默认参数位置_二十二、Python函数参数类型(位置、关键字、默认、不定长参数)...
调用函数时可使用的参数类型 在调用Python函数时可使用的参数类型主要有以下几种: 必要参数(位置参数) 关键字参数 默认参数 不定长参数 必要参数(位置参数) 在Python中, 必要参数必须以正 ...
- std::bind绑定成员函数,为什么第二个参数必须绑定对象地址
std::bind 这个函数在绑定成员函数的时候,必须显示指明实例化后的对象的地址. 因为在此处bind的第一个参数是 类 的成员函数的地址,没有经过实例化,所以不是内存中真正的位置,需要配合实例化后 ...
- Python - 在定义函数时,为什么默认参数不能放在必选参数前面?
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 我们尝试直接定义这样的函数,看看Python解释器会 ...
- c++函数模板,有默认参数的函数
1.函数模板 #include <iostream> using namespace std; template <typename T> //template<clas ...
- python静态变量定义_Python的学习(二十一)----Python的静态变量
前段时间在论坛里面有人提问说, class foo(): member1 member2 ... self.member1 foo.member2 其中的两个成员member1, member2有什么 ...
最新文章
- 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
- java 什么是泛型?
- 根据SAP表名或视图查询后台配置路径
- Java线程之两种方法Runnable和Thread的区别
- 查看dataloader的大小_一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
- 盘点丨2019十大边缘计算项目
- Struts2中的国际化
- C++ static 类成员
- 贪心 Codeforces Round #303 (Div. 2) B. Equidistant String
- Linux下的uniq,head,tail,cut,paste
- KL散度-Entropy-JS散度-W距离
- linux软件源怎么看,Linux软件源
- vue typeScript get set 用法
- JavaScript 对象的创建与继承——创建篇
- Fleck说明文档翻译
- 第N次重装系统之win10注册表
- 西安交大软件学院推免远程面试夏令营分享
- ARC059 E - Children and Candies(dp)
- 【JavaSE】多态数组的使用
- golang并发http请求几种方式