Scala深度学习2

day02

scala中的抽象类

abstract class Father(newName:String) {

  protected var name:String=newName

  //抽象方法
  def eat(food:String):Unit

  //普通方法
  def run():Unit={
println(this.name+"is running...")
  }
}

类的继承

class Father(newName:String) {

  protected var name:String=newName

  //普通方法
  def eat(food:String):Unit={
println(this.name+"is running...")
  }
}

class Son(newName:String) extends Father(newName){
  override def eat(food:String):Unit={
println("like"+food)
  }
}

object Son{
  def main(args: Array[String]): Unit = {
val son=new Son("son1")

println(son.name)
son.eat("noodle")
  }
}
//注:在Scala的构造器中,你不能调用super(params),
// 不像java,可以用这种方式调用超类构造器

类中的get/set和辅助构造器和先决条件

class User(newId:Int,newName:String) {

  //先决条件
  require(newId > 0)
  require(!newName.isEmpty)

  private var id:Int = _
  private var name:String=_
  private var age:Int=_

  //辅助构造器
  def this(id:Int,name:String,age:Int){
this(id,name)//必须先把主构造器参数调用一遍
this.age=age
  }

//class User {
//  private var id:Int = _
//  private var name:String=_
//  private var age:Int=_
//
//  //辅助构造器
//  def this(id:Int){
//    this()
//    this.id=id
//  }
//
//  def this(id:Int,name:String){
//    this()
//    this.id=id
//    this.name=name
//  }
//
//  def this(id:Int,name:String,age:Int){
//    this()
//    this.id=id
//    this.name=name
//    this.age=age
//  }

  val getId = ()=>this.id
  val setId = (id:Int)=>this.id=id

  val getName = ()=>this.name
  val setName = (name:String)=>this.name=name

  val getAge = ()=>this.age
  val setAge = (age:Int)=>this.age=age

  override def toString: String = {
"User(id=" + this.id + ",name=" + this.name +
",age=" + this.age + ")"
  }
}

object UserTest {
  def main(args: Array[String]): Unit = {
val user = new User(10,"pp")
user.setId(1001)
user.setName("Mike")
user.setAge(18)
println(user)
  }
}

trait定义(类似java中的接口)

trait Human {//接口

  def eat(food:String):Unit
  def run():Unit
  def doSomeThing(thing:String):String
}

trait Employee {
  def work():Unit
}

实现类

class People extends Human with Employee {

  override def eat(food: String): Unit = {
println("eating: "+food)
  }

  override def run(): Unit = {
println("running...")
  }

  override def doSomeThing(thing: String): String = {
"do "+thing
  }

  override def work(): Unit = {
println("i'm working...")
  }
}

伴生对象(在java中会用到既有实例方法又有静态方法的类,scala中可以通过类和与类同名的伴生对象来达到同样的目的)

class Account {

  private val accountNumber = Account.generateNewNumber
  private val balance = 0.0

  def show():Unit={
println("accountNumber: "+accountNumber)
println("balance: "+balance)
  }
}

object Account{
  private var lastNumber = 0

  private def generateNewNumber():Int={
lastNumber += 1
lastNumber
  }
}
//注:类的伴生对象的功能特性并不在类的作用域内,
// 必须通过对象名。属性或对象名.方法来调用

应用程序对象(每个scala程序出了从一个对象的main方法启动外还可以通过继承App程序来启动程序)

//正常启动
object HelloWorld { // 程序入口
  def main(args: Array[String]):Unit = {
    println("Hello World!!") // 输出 Hello World!!
  }
}
//继承App启动
object HelloWorld extends App{
  println("Hello World!!") // 输出 Hello World!!
}
//每个Scala程序都必须从一个对象的main方法启动,
// 除了使用main方法,还可以通过继承App程序来启动程序

scala导入包求平方根

def sqrtplus1(x:Int)={
  import scala.math.sqrt
  sqrt(x)+1.0
}

变长数组(数组的长度可以改变)

object ArrayBufferTest {
def main(args: Array[String]): Unit = {
  import scala.collection.mutable.ArrayBuffer
  var arr = new ArrayBuffer[Int]()
  //添加元素
  arr += 1
  arr += 2
  arr += 3

  println(arr.mkString(","))
    }
  }

常用算术操作

def main(args: Array[String]): Unit = {
import scala.collection.mutable.ArrayBuffer
val arr = ArrayBuffer[Int](1,2,3,4,5,6,7,8)
//求和
println("sum: "+arr.sum)
//求极值
println("max: "+arr.max)
println("min: "+arr.min)
//简单排序
var sortedArr = arr.sorted
sortedArr.foreach(println)
}

定义样例类

//定义样例类
//一个最简单的案例类定义由关键字case class,类名,参数列表(可为空)组成
object CaseClassTest{
  case class Person(id:Int,name:String)

  def main(args: Array[String]): Unit = {
//case class会自动生成apply方法,创建对象时无需用new
val person = Person(1001,"Mike")
println("person: "+person)
  }

定义泛型类(Stack类的实现可以用任意类型A作为参数)

//泛型类
class Stack[A]{
  private var elements:List[A]= Nil
  def push(x:A){elements=x::elements}
  def peek:A=elements.head
  def pop():A={
val currentTop = peek
elements=elements.tail
currentTop
  }
}

使用泛型类(使用具体的类型替换A)

//使用
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
println(stack.pop)//prints 2
println(stack.pop)//prints 1

map函数(map操作时针对集合的典型变换操作,它将某个函数应用到集合中的每个元素,并产生一个结果集合)

val salaries = seq(20000,70000,40000)
val doubleSalary=(x:Int)=>x*2
val newSalaries = salaries.map(doubleSalary)//List(40000,140000,80000)

//简化代码
val salaries = Seq(20000,70000,40000)
val newSalaries= salaries.map(x=>x*2)
//上述示例中x没有被显式声明为int类型,这是因为编译器能够根据map函数期望的类型推断出x的类型
//对于上述代码,一种更惯用的写法为
val salaries = seq(20000,70000,40000)
val newSalaries= salaries.map(_*2)

flatMap函数(flatMap是map的一种扩展。在flatMap中,我们会传入一个函数,该函数对每个输入都会返回一个集合(而不是一个元素),然后,flatMap把生成的多个集合“拍扁”成为一个集合)

val words = Seq("H e l l o","W r o l d")
val result = words.flatMap(_.split(" "))
println("result: "+ result)

reduce函数(reduce函数可以对集合当中的元素进行归约操作,其中下划线是占位符,两个下划线表示归约的规则是使用前后两个元素,中间的加号,用来表示对元素的操作,这里我们使用的是加法如果我们不指定reduce是left还是right默认情况下会使用reduceLeft执行操作)

val list = List(1,2,3,4,5,6)
//val result = list.reduceLeft(_+_)
//val result = list.reduceRight(_+_)
val result = list.reduce(_+_)
println("result: "+result)

foreach函数(foreach函数与map函数相似,都是用于遍历集合对象,并对每一项执行指定的方法,但两者的差异在于:foreach无返回值(准确来说是void),map返回集合对象)

val list = List(1,2,3,4,5,6)
list.foreach(println)

groupBy函数(groupBy函数将列表进行分组,分组的依据是应用groupBy函数中函数的返回值)

val list = List("a","b","c","d")
val result = list.groupBy(x=>{
  x match{
case "a"=>1
case "b"=>1
case _=>2
}
})
println(result)
//====================================
val seq = Seq((100,"Mike"),(85,"Bob"),(90,"Mike"))
val result = seq.groupBy(_._2)
println(result)

filter函数(filter函数用于保留列表中符合条件的列表元素)

val list=List(100,80,60,95,88)
val newList = list.filter(_>60)
println("newList: "+newList)

count函数(count函数计算列表中所有满足条件的元素的个数)

val list = List(100,80,60,95,88)
val newList = list.count(_>60)
println("newList: "+newList)

sortBy函数(sortBy函数用于通过它的类型对一个属性或多个属性进行排序)

val list = List(100,80,60,95,88)
val newList = list.sortBy(x=>x)
//val newList = list.sortBy(x=>x).reverse
println("newList: "+newList)

diff函数(diff函数用于保存列表中那些不在另外一个列表中的元素,即从集合中减去与另外一个集合的交集)

val list1 = List(1,2,3,4,5,6)
val list2 = List(3,4,6)
val list3 = list1.diff(list2)
println(list3)

union函数(union函数用于保存两个集合的元素)

val list1 = List(1,3,5,6)
val list2 = List(2,4,6)
val list3 = list1.union(list2)
println(list3)

intersect函数(intersect函数用于保存与另外一个集合的交集)

val list1 = List(1,3,5,6)
val list2 = List(2,4,6)
val list3 = list1.intersect(list2)
println(list3)

take函数(take函数用于提取列表的前n个元素)

val list = List(1,3,5,7,9,7,9)
val takeList = list.take(3)
println("take list: "+takeList)

drop函数(drop函数用于丢弃前n个元素,返回剩下的元素)

val list = List(1,3,5,7,9,7,9)
val dropList = list.drop(3)
println("drop list: "+dropList)

partition函数(partition函数用于将列表分为两部分,第一部分为满足条件的元素,第二部分为不满足条件的元素)

val list = List(1,2,3,4,5,6,7,8,9)
val lists = list.partition(_%2==0)
println(lists)

隐式转换(将高精度类型转换为低精度类型)

val num:Int = 12.5//提示错误,高精度无法自动转换为低精度类型
println("num: "+num)

//加入隐式转换
implicit def f1(x:Double):Int ={
  x.toInt
}
  def main (args: Array[String] ): Unit = {
val num:Int = 12.5//代码正常解释
println("num: "+num)
}
//隐式转换函数
//隐式转换函数是以implicit关键字声明的带有单个参数的函数
//这种函数将会在某个时刻下自动运行,将某个值从一种类型转换为另一种类型
//注:隐式转换函数名可以是任意的
//隐式转换函数与函数名无关,只有函数签名(函数参数类型和返回值类型)有关
//隐式函数可以有多个,但要保证在当前作用域,只有一个隐式函数被识别

隐式值(隐式值又叫隐式变量,即由implicit修饰的变量,编译器会在方法参数缺省的情况下搜索,同一作用域的隐式值作为缺省参数)

class ImlicitValue{

  def test1(implicit value: String): Unit = {
println("test1 value: " + value)
  }

  def test2(implicit value: String):Unit = {
println("test2 value: " + value)
  }
}

object ImplicitValue {
  implicit val implicitValue: String = "implicit value"

  def main(args: Array[String]): Unit = {
val iv = new ImplicitValue
iv.test1
iv.test2
  }
}
Scala中的Actor

什么是Actor
一个actor是一个容器,它包含 状态, 行为,信箱,子Actor 和 监管策略,所有这些包含在一个ActorReference(Actor引用)里。一个actor需要与外界隔离才能从actor模型中获益,所以actor是以actor引用的形式展现给外界的。

Actor 简单实现

//创建Actor
import scala.actors.Actor

class MessageActor extends Actor {
  override def act(): Unit = {
for (i <- 1 to 5) {
  println("i: " + i)
  Thread.sleep(1000)
}
  }
}

//启动Actor
object MessageActorTest{
  def main(args: Array[String]): Unit = {
val messageActor = new MessageActor
messageActor.start()
  }
}

Actor消息发送

//消息类定义
import scala.actors.Actor

class HelloActor extends Actor {
  override def act(): Unit = {
while (true) {
  receive {
    case msg: String =>
      println("Hello " + msg)
    case msg: Int =>
      println("Your choose " + msg)
    case _ =>
      println("byte")
  }
}
  }
}

//消息发送
object HelloActorTest {
  def main(args: Array[String]): Unit = {
val helloActor = new HelloActor
helloActor.start()

helloActor | "scala"
helloActor | 1020
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值