scala_mark_001

最近今天开始研究scala, 由于本人一直从事的是java相关开发, 所以写一点感触学习过程。


由java 学习scala 还是蛮有意思的, scala是基于jvm的,所以很多东西都是共通的,唯独在编程思想上, 如何有函数式编程的思维、如何采用静态类处理的方式。


下面是学习过程中的一些笔记:

========================================

1、scala 的特性:兼容性,简短,高层级抽象和高级的静态类别,
集合了erlang的多线程并发特性库,java的无缝结合,高延伸性


2、Scala是很容易进入的语言。它跑在标准的Java平台上,可以与所有的Java库实现无缝交互。它也是用来编写脚本把Java控件链在一起的很好的语言。但是用它来建立大系统和可重用控件的架构将更能够发挥它的力量。 
从技术层面上来说,Scala是一种把面向对象和函数式编程理念加入到静态类型语言中的混血儿。Scala的许多不同的方面都展现了面向对象和函数式编程的熔合;或许它比其他那些广泛使用的语言更有渗透性。在可伸展性方面,这两种编程风格具有互补的力量


=====================================
3、培育新的控制结构 
Java伴随着一个丰富的,基于线程的并发库。Scala可以像其他JavaAPI那样使用它编程。然而,Scala也提供了一个实质上实现了Erlang的行动类模型的附加库。 


行动类是能够实现于线程之上的并发抽象。它们通过在彼此间发送消息实现通信。每个行动类都能实现两个基本操作,消息的发送和接受。发送操作,用一个惊叹号表示,发送消息给一个行动类。
============================================


4、不可变是函数式语言的基石。
在Java和Scala里,字串是一种数学意义上的字符序列。使用表达式如s.replace(';', '.')在字串里替换字符会产生一个新的,不同于原字串s的对象。用另一种表达方式来说就是在Java里字串是不可变的(immutable)而在Ruby里是可变的。因此单看字串来说,Java是函数式语言,而Ruby不是。不可变数据结构是函数式语言的一块基石。Scala库在Java API之上定义了更多的不可变数据类型。例如,Scala有不可变的列表,元组,映射表和集。 


另一种说明函数式编程第二种理念的方式是方法不应有任何副作用:side effect。它们唯一的与所在环境交流的方式应该是获得参数和返回结果。举例来说,Java的String类的replace方法符合这个描述。它带一个字串和两个字符并产生一个所有一个字符都被另一个替代掉的新字串。调用replace不会有其他的结果。类似于replace这样的方法被称为指称透明:referentially transparent,就是说方法调用对任何给定的输入可以用它的结果替代而不会影响程序的语义
============================================


5、Scala是静态类型的 
    1)、可检验属性。静态类型系统可以保证消除某些运行时的错误
    2)、安全的重构。静态类型系统提供了让你具有高度信心改动代码基础的安全网。(因为是静态, 所以会提前检查,避免重构过程中的其他错误)
    3)、文档。静态类型是被编译器检查过正确性的程序文档 {
    比如
val x: HashMap[Int, String] = new HashMap[Int, String]()  可以写成
val x = new HashMap[Int, String]() val x: Map[Int, String] = new HashMap() 
}


=========================================
6、定义变量:
val 类java 的final变量。
var 定义非final变量,可多次赋值。


==================================
7、类型推断:type inference,这种Scala能自动理解你省略的类型的能力
如val msg = "hello world"
他会自动推断为java.lang.String类型。
==============================
8、函数定义:
 


可以存在既没有参数也没有返回值的函数:
def greet () = println("welcome to scala")
greet: ()Unit 当你定义了greet()函数,解释器会回应一个greet: ()Unit。“greet”当然是函数名。空白的括号说明函数不带参数。Unit是greet的结果类型。Unit的结果类型指的是函数没有返回有用的值。Scala的Unit类型比较接近Java的void类型,而且实际上Java里每一个返回void的方法都被映射为Scala里返回Unit的方法。
===========================
9、获取数组时,采用的是()而不是[], 如 args(0) 而非args[0];
scala 里面没有java的++ -- 自增,自减等操作。


===========================
10、while 循环
var i = 0
    while(i<args.length){
      print(" ")
      print(args(i))
      i+=1
    }
    println()
foreach 循环
args.foreach(arg => {
      print("-- ")
      println(arg)
    })
// or
args.foreach(arg => println(arg))


// 显示类型的调用
args.foreach((arg : String) => println(arg))
//也可以采用这种方式,直接调用函数进行,不设置参数
args.foreach(println) 


=======================================
11、定义数组的时候必须设置数组元素对象的类型
带类型的参数化数组
val greetStrings = new Array[String](3)   // 因为是静态类型,所有自动检查识别为正确的类型
greetStrings(0) = "Hello" 
greetStrings(1) = ", " 
greetStrings(2) = "world!\n"
for (i <- 0 to 2) 
print(greetStrings(i)) 


// 对数组的操作其实也是对立面每一个元素当作对象的操作
// 新建一个Array 的方式
// 采用 val greetStrings = new Array(3) 也是可以的


val greetStrings = new Array[String](3)
    greetStrings.update(0, "Hello")
    greetStrings.update(1, ", ")
    greetStrings.update(2, "world!\n")
    for (i <- 0.to(2))
      print(greetStrings.apply(i))


greetStrings.apply(i) 等同于 greetString(i)。


// 另外定义数组的方式, Array这个类提供的方法。
    var greetStrings = Array("one","twee","three")
    var greetStrings2 = Array.apply("one","twee","three")


======================================
12、从技术上讲,Scala没有操作符重载,因为它根本没有传统意义上的操作符。取而代之的是,诸如+,-,*和/这样的字符可以用来做方法名。因此,当第一步里你在Scala解释器里输入1 + 2,你实际上正在Int对象1上调用一个名为+的方法,并把2当作参数传给它。


=================================


13、使用list, 区别于java 的List, scala的List定义以后不可变。


=============================


14、元组:
val pair = (99, "Luftballons") 
println(pair._1) println(pair._2) 


获取元组中的值不能使用类似 Array,List中的apply 是因为元组中的对象可能是不同类型的。
元组的索引都是从1开始的, 区别于Array,List等从0开始。
========================================
15、Set 集合,默认情况下,使用的Set为不可变集
var jetSet = Set("Boeing", "Airbus") 
jetSet += "Lear" 
println(jetSet.contains("Cessna")) 
Set 的可变集和不可变集
 
============================================


16、Map 也存在可变和不可变集


//默认是不可变的Map集合。

val immutableMap = Map(1->"go",2->"come",3->"out")

//可变集合
import scala.collection.mutable.Map 
val treasureMap = Map[Int, String]() 
treasureMap += (1 -> "Go to island.") 
treasureMap += (2 -> "Find big X on ground.") 
treasureMap += (3 -> "Dig.") 
println(treasureMap(2)) 

==========================================
17、简单读取文件:
 

val filePath = "/home/linfssay/Simple Project/simple.sbt"
//    if (!filePath.isEmpty){
//      for (line <- Source.fromFile(filePath).getLines)
//      println(line.length + " " + line) }
//    else
//      Console.err.println("Please enter filename")


    // another method
    // first、 change file line by Iterator to List
    val lines = Source.fromFile(filePath).getLines.toList
    val longestLine = lines.reduceLeft( (a, b) => if (a.length > b.length) a else b )
    val maxWidth = widthOfLength2(longestLine)
    for (line <- lines) {
      val numSpaces = maxWidth
//      widthOfLength(line)
      //declare space
      val padding = " " * numSpaces
      println(padding +" | " + line.length +" "+ line)
    }


  }


  // this define method return the value s.length as default
  def widthOfLength(s: String) = s.length.toString.length


  def widthOfLength2(s:String) : Int = {
    s.length.toString.length
  }







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章