天天看點

Scala第一章學習筆記

  面向對象程式設計是一種自頂向下的程式設計方法。用面向對象方法構造軟體時,我們将代碼以名詞(對象)做切割,每個對象有某種形式的表示服(self/this)、行為(方法)、和狀态(成員變量)。識别出名詞并且定義出他們的行為之後,再定義出名詞之間的互動。

  函數式程式設計方法通過組合和應用函數來構造軟體。純粹是對輸入進行操作,産生結果。所有變量都被認為是不可變的。

  Spring的JDBCTemplate類上的查詢方法

public interface JdbcTemplate{
    List query(PreparedStatementCreator psc,RowMapper rowMapper)
    .......
}      

  用Scala直譯

trait JdbcTemplate{
    def query(psc : PreparedStatementCreator,rowMapper : RowMapper) : List[_]
}      

看一下PreparedStatementCreator接口和RowMapper接口

public interface PreparedStatementCreator {
    PreparedStatement createPreparedStatement(Connection con) throws SQLException;
}


public interface RowMapper{
    Object mapRow(ResultSet rs, int rowNum) 
throws SQLException;
}      

Scala提供了一等函數,把JdbcTemplate查詢方法改成接受函數而不是接口作為參數。這樣query方法就程式設計函數式了,傳回值為ResultItem,這就是傳說中的租借模式了。這樣就建立了一個直接使用函數參數的接口了。

trait JdbcTemplate{
    def query[ResultItem](psc:Connection => PreparedStatement; rowMapper : (ResultSet,Int) => ResultItem) : List[ResultItem]
}      

Scala組合斷言, or 方法接受兩個斷言,f1,f2,産生一個匿名函數。這個函數接受函數t,然後把f1(t)和f2(t)的結果 or 一下。

object Predicates{
    def or[T](f1 : T => Boolean, f2 : T =>Boolean) = (t : T) => f1(t) || f2(t)

    def and[T](f1 : T =>Boolean,f2 : T=> Boolean) = (t : T)=> f1(t) && f2(t)

    val notNull[T] : T => Boolean = _ != null

                                   (_為文法占位符)      

Scala把變量類型等基本操作

//可變整型變量
var x : Int

//不可變整型變量
val x : Int

//延遲執行的不可變整形變量
lazy val x : Int

//使用者指定類型
val x : Int = 5

//編譯器推斷類型
val y = 5


def myMethod(functionLiteral : A => B) : Unit
//顯示的類型聲明
myMethod({ arg : A : => new B})
//類型推斷
myMethod({ arg => new B})      

較簡潔版的Scala快速排序

def qsort[T <% Ordered[T]](list:List[T]):List[T] = list match{
    case Nil => Nil
    case x :: xs =>
        val (before,after) = xs partition ( _ < x)
        qsort(before) ++ (x :: qsort(after));
)      

Scala調用Java 使Java類庫成為用Scala做開發時很自然的事

//Java對象
class SimpleJavaClass {
    private String name;
    public SimpleJavaClass(String name){
    this.name = name;
    }
    
    public String getName(){
     return name;
    }
    
    public static SimpleJavaClass create(String name){
        return new SimpleJavaClass(name);
    }
}

//Scala裡使用簡單java對象

    val x = SimpleJavaClass.create("Test")
    x.getName()
    val y = new SimpleJavaClass("Test")      

Scala對象映射到java Scala對象實際上是一個單例類,在編譯時此單例類命名為對象名後價格$符号。這個單例類裡有個Module$靜态成員,指向其唯一執行個體。

//Scala 對象
object ScalaUtils{
    def log(msg : String) : Unit = Console.println(msg)
    
    val MAX_LOG+SIZE = 1056
}


//在Java裡使用Scala對象
ScalaUtils.log("Hello!");
ScalaUtils$.MODULE$.log("Hello");
System.out.println(ScalaUtils$.MODULE$.MAX_LOG_SIZE());
System.out.println(ScalaUtils.MAX_LOG_SIZE());