scala基础入门

类方法、if、while、for
package per.xxl

/**
 * @author Administrator
 */
class HelloScala {
  
}

//object声明类,表示此类为单例,在第一次调用的时候初始化
//类中的方法都是静态方法
object HelloScala{
  
  def hello(name:String):String={
    "hello "+name
  }
  //无参方法可以去掉(),如果没()则调用时不能有()
  def helloScala(){
    println("hello scala ,this is rocky!")
  }
  
  //默认参数
  def helloDefault(s:String="addd"){
    println("hello "+s)
  }
  
  //匿名函数
  def add=(x:Int,y:Int)=>x+y
  //函数编程的柯里化
  def add2(x:Int)(y:Int)=x+y
  //函数赋给常量
  var sum=(x:Int,y:Int)=>x+y
  
  //可变参数
  def varliableParameters(s:String*)={
    s.foreach ( x => println(x) )
  }
  
  def main(args:Array[String]){
    println("hello Scala")
    
    println(hello("scala1"))
    
    helloScala
    
    //隐藏()
    helloScala
    
    helloDefault()
    
    //定义函数和表达式
    println (add(1,2))
    println (add2(1)(2))
    println (sum(1,2))
    
    varliableParameters("aa","bb","cc","123")
    
    //if
    println("if:"+(if(1>0)1 else 0))
    
    //while
    var (n,r)=(10,0)
    while(n>0){
      r=r+n
      n-=1
    }
    println("while :"+r)
    
    //for
    for(i<- 1 to 10){
      println("for:"+i)
    }
    //until 到10不再执行
    for(i<- 1 until 10){
      println("for until:"+i)
    }
    
    for(i<- 1 to 10 if i%2==0){
      println("for if:"+i)
    }
  }
}
OOP、继承与构造
package per.xxl

/**
 * @author Administrator
 */
class OOPInScala {
  
}

class Person{
  //属性声明 var可以get,set val只有get相当于java的final属性
  var name:String =_
  val age=27
  
  private[this] val gender="male"
}

//1,主构造器直接跟在类名后面,主构造器中的参数会被编译成类的字段;
//2,主构造器执行的时候会执行类中的所有不包含在方法体中的语句;
class Person1(val name:String,val age:Int){
  println("this is p1 construct ")
}

//如果在 主构造器函数的参数中没有用val或者var去声明变量,
//那此时的变量是private[this]级别的,只能够被类内部访问
class Person2(name:String,val age:Int){
  println("this is p2 construct ")
}

class Person3(val name:String,val age:Int){
  println("this is p3 construct ")
  var gender:String =_
  val unit:String="PU"
  //1, 附属构造器是用this来声明的;
  //2, 附属构造器中必须调用主构造或者其它附属构造器;
  def this(name:String,age:Int,gender:String){
    this(name,age)
    this.gender=gender
  }
}

//继承,重写的方法或属性字必须加上override
class Students(name:String,age:Int,majoy:String) extends Person3(name,age){
  println("this is student construct ")
  
  //重写属性,var易变属性不能被重写,因为不需要,可以直接进行操作
  //override var gender="female"
  override val unit="AU"
  
  //override def toString = "override to String"
  /*override def toString():String={
    //使用return 必须在方法后面指定返回类型
    return "override to String"
  }*/
  
  override def toString()={
    //不声明方法的返回类型,则默认最后一个表达式为返回值
    "override to String"
  }
}

object OOPInScala{
  
  
  def main(args:Array[String]){
    val p = new Person
    p.name="Rocky"
    
    println(p.name+":"+p.age)
    //private 直接调用出错
    //p.gender
    val p1 = new Person1("rocky",27)
    println("P1: "+p1.name+":"+p1.age)
    
    val p2 = new Person2("rocky",22)
    //println("P2: "+p2.name+":"+p2.age)
    
    val p3 = new Person3("rocky",32,"man")
    println("P3: "+p3.name+":"+p3.age+":"+p3.gender)
    
    var stu = new Students("rocky",22,"computer")
    stu.gender="man"
    println("stu:"+stu.toString()+"\ngender:"+stu.gender+"\nunit:"+stu.unit)
  }
}
抽象类和trait
package per.xxl

/**
 * @author Administrator
 */
class AbstractScala {
  
}
//抽象类
abstract class People{
  def speak
  def speak2={
    println("this is abstract!")
  }
  var age:Int
  //"final"类型只能由子类实现
  val name:String
}

class Worker extends People{
  def speak={
    println("hello speak!")
  }
  //已实现的抽象方法需要加上override,可以不用重写这个方法
  override def speak2={
    println("hello speak2!")
  }
  var age:Int=27
  //"final"类型只能由子类实现
  val name:String="worker"
}

//特质类,可以有实现方法
trait People1{
  def speak
  def speak2={
    println("this is trait!")
  }
  var age:Int
  //"final"类型只能由子类实现
  val name:String
}

class leader extends People1{
  def speak={
    println("this is leader")
  }
  var age:Int=23
  val name:String="leader"
}

//继承抽象类和特质类,可以extends和with多个特质类,抽象类只能单继承
class coder extends People with People1{
  def speak={
    println("this is coder")
  }
  //因为people和people1都实现了speak2,所以必须要重写
  override def speak2={
    println("hello coder speak2!")
  }
  var age:Int=23
  val name:String="coder"
}

//App是scala定义的一个可执行接口
//App内部帮助我们实现了main方法并管理代码
object AbstractScala extends App{
 
  val worker = new  Worker
  worker.speak
  println(worker.age+":"+worker.name)
}
Apply方法
package per.xxl

/**
 * @author Administrator
 */
class ApplyScala {
  
}
//apply相当于一个类的别名函数
//在单例类和普通类中有些区别
class ApplyTest{
  def apply()={println("class apply在初始化val b = new ApplyTest()对象后,会当做b()的别名")}
  def test(){
    println("test")
  }
}
//单例类,方法都是静态的
object ApplyTest{
  def apply():ApplyTest={
    println("object apply 会当做ApplyTest()的别名")
    return new ApplyTest()
  }
  def static(){
    println("static test")
  }

}

object ApplyScala extends App{
  ApplyTest.static()
  val a = ApplyTest()
  a.test
  
  val b = new ApplyTest()
  b()
  b.test()
  
}
List
package per.xxl

import scala.collection.mutable.ListBuffer

/**
 * @author Administrator
 */
class CollectionScala {
  
}

object CollectionScala extends App{
  //list的元素值是不能变的l(2)=xx编译错误
  //调用静态list的apply函数
  var l  = List(1,2,3,4,5,6)//
  //声明list类型的方式
  var ll:List[Int] = List(1,2,3,4,5,6)
  //list头添加
  l = 7::l
  l = l.::(8)
  println(l+" 取第1位值:"+l(1))
  //反向
  println("反向:"+l.reverse)
  //取头元素
  println("取头元素:"+l.head+" 取尾元素:"+l.last)
  //取除头元素以外的元素
  println("取除头元素以外的元素:"+l.tail+"\n取除尾元素以外的元素:"+l.init)
  //过滤
  println("过滤:"+l.filter(_%2==0))
  //list拼接
  println("拼接:"+(l:::ll))
  //zip操作,对应有unzip方法,zip会丢掉多余list的数据
  println("zip:"+(l zip ll))
  //切割,按规则划分为两个list。注意表达式和filter的表达式两种不同的方式都可以
  println("切割:"+l.partition { x => x%2==0 })
  println("切割1:"+(l.partition { x => x%2==0 })._1)
  //合并
  println("合并:"+List(l,ll,l).flatten)
  //按规则合并
  println("合并1:"+List(l,ll).flatMap { x => x.map { x => x+1 } })
  //排序
  println("降序:"+l.sortWith(_>_)+" 升序:"+l.sortWith(_<_))
  
  //通常不建议直接对List进行编辑修改等操作如果需要用BufferList
  var bl = ListBuffer(1,2,3,4,5)
  println(bl)
  bl(1)=99
  println(bl)
  println(bl.toList)
}
隐式转换、隐式参数、隐式类
package per.xxl

/**
 * @author Administrator
 */
class Implicit {
  
}

/**
 * 隐式转换、隐式参数、隐式类
 */
class A{
  
}

class RichA{
  def rich{
    println("this is rich A")
  }
}

object Implicit extends App{
  //隐式函数的参数为A
  implicit def AimRichA(a:A) ={
    println("hei! implicit RichA")
    //最后一个表达式为函数返回值
    new RichA()
  }
  //val a= AimRichA(new A),不用写函数名,想想类的apply()函数
  val a = new A
  a.rich
  
  //隐式参数
  def impParam(implicit name:String){
    println("implicit param:"+name)
  }
  implicit val name="hello!"
  //使用了隐式参数 name,相当于impParam(name)
  impParam
  //也可以指定参数
  impParam("hello2!")
  
  //隐式类
  implicit class inc(i:String){
    def add(a:Int):Int={
      return a+1
    }
  }
  //相当于new inc("aa").add(1)
  println("aa".add(1))
}
时间: 2024-10-03 10:47:25

scala基础入门的相关文章

Scala基础入门-1

首先需要Scala开发环境的搭建,网上自己找教程. 声明常量与变量 val foo = 0 // 常量 var bar = 0 // 变量 在Scala中,更加鼓励使用val来进行声明,也就是推荐使用常量.在大部分时候不需要分号,看自己便好…虽然是强静态类型的语言,但是却并没有写出类型——这就是类型推断. 也可以指定类型: val spark: String = "Hello Scala" 多个的同时声明: val xInt, yInt = 100 // xInt, yInt都声明为1

Scala基础入门-代码碎片

import scala.util.control._ import java.util.Date object Test { def main(args: Array[String]) { // var a = 10; // var b = 20; // var c = 25; // var d = 25; // println("a + b = " + (a + b) ); // println("a - b = " + (a - b) ); // printl

Scala 基础入门【翻译】

原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变变量 val.可变变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果). 题外话,如果 Java 争气的话,还就真不会出现像 Scala 这些语言.对于函数编程风格的支持,尤其是对于 Lambda 表达式的支持,能够有助于减少必须要编写的逻辑无关样板代码,也许让它可以更简单的关注要面对的任务本身.而 Java 对 Lamdba 表达式的支持到 JavaSE8 才

Scala基础入门-4

Scala学习——类 简单类和无参方法 class Counter { private var value = 0 // 必须初始化字段 def increment() { value += 1 } // 方法默认公有 def current() = value } Scala中的类不声明为public,一个Scala源文件中可以有多个类. val myCounter = new Counter // 或new Counter() myCounter.increment() 调用无参方法时,圆括

Scala基础语法(声明定义、标识符命名、Scala脚本入门)

一.声明与定义(赋值) 1.val, 常量声明   val x:T val x:T=e 2.var, 变量声明   var x:T var x:T=e ?类型省略(默认类型)val x=e var x=e ? 声明省略(连续声明) val x1,x2,x3 等价于 val x1;val x2; var x1,x2,x3:T=e  等价于  var xn:T=e 3.def,函数声明def abc(xn:T):T*=e def adder(m:Int,n:Int) =m+n def adder()

Spark入门到精通视频学习资料--第一章、Scala基础与实践

第一章.Scala基础与实践(3讲) Scala编程语言抓住了很多开发者的眼球.如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格. 根据David Rupp在博客中的说法,Scala可能是下下一代Java. Scala有几项关键特性表明了它的面向对象的本质.例如,Scala中的每个值都是一个对象,包括基本数据类型(即布尔值.数字等)在内,连函数也是对象.另外,类可以被子类化,而且Scala还提供了基于mixin的组合(mix

【原创 Hadoop&amp;Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实验: 练习1 利用Spark Shell(本机模式) 完成WordCount spark-shell 进行Spark-shell本机模式 第一步:通过文件方式导入数据 scala> val rdd1 = sc.textFile("file:///tmp/wordcount.txt")

大数据系统学习零基础入门到精通加项目实战2017最新全套视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧