Home > Scala > 《Programming Scala》:Scala 的特性

《Programming Scala》:Scala 的特性

本文是《Programming Scala》第一章的笔记,Scala 是一门很有趣也很简练的语言。

Scala为并行,简洁,可伸缩性而设计,它是一种函数式和面向对象的混合式语言,提供了基于actor的消息传递模型以去除并行带来的复杂性。使用这个模型,可以编写简洁的多线程代码(synchoroize关键字可以从词汇中消除了),而不用担心线程之间的数据连接以及处理锁和释放所带来的问题。

然而Scala也能用来编写单线程的应用程序,或者作为多线程应用的单线程模块,它的函数式风格有利于单线程和多线程的应用。Scala的并行模型与Erlang的风格很相似,但Scala的优点是:它是强类型而Erlang是弱类型,能在JVM上运行,与Java很好的进行交互。

下图展示了Scala在企业应用中适合的地方:

scala-in-enterprise

Scala in Enterprise Environment

注意到,可以将Java代码包装在Scala的actor库中提供线程的隔离,如果要在线程之间通讯,则使用Scala轻量级API来传递信息。在Scala中不用在创建线程时马上用同步来限制其并行,而是在不使用锁的情况下进行真正的并行操作,这就能更关注应用逻辑而不是低层次的线程。

Scala是静态类型的,但与Java 不同的是,不必明确反复地指定类型,很多情况下编译器可以进行类型推断,这一特性在简化函数的参数和返回值时很有用。

Scala的内核是很小的,其它包含操作符,Actor,都仅仅只是Scala库的一部份,可扩展性是极强,完全可以自行写一个实现。函数式编程是一种声明式的风格,在这种风格中指明的是“做什么”而不是“应该怎样做”,在XSLT,规则引擎,或者ANTLR中使用的就是函数式风格。

在一个数组中寻找最大值的函数式编程如下:

def findMax(temperatures : List[Int]) = {
	temperatures.foldLeft(Integer.MIN_VALUE) {
  		Math.max
	}
}

将列表中的每个元素乘以2:

val values = List(1, 2, 3, 4, 5)
val doubleValues = values.map( _ * 2)

计算一个数的阶乘:

def fact(n: Int) = 1 to n reduceLeft (_*_)

从网络获取股票的收盘价并找出最大值:

import scala.actors._
import Actor._

val symbols = List( "AAPL", "GOOG", "IBM", "JAVA", "MSFT")
val receiver = self
val year = 2006

symbols.foreach { symbol =>
	actor { receiver ! getYearEndClosing(symbol, year) }
}
val (topStock, highestPrice) = getTopStock(symbols.length)
printf("Top stock of %d is %s closing at price %f\n", year, topStock, highestPrice)

def getYearEndClosing(symbol : String, year : Int) = {
	val url = "http://ichart.finance.yahoo.com/table.csv?s=" +
			symbol + "&a=11&b=01&c=" + year +
			"&d=11&e=31&f=" + year + "&g=m"
	val data = io.Source.fromURL(url).mkString
	val price = data.split("\n")(1).split(",")(4).toDouble
	(symbol, price)
}

def getTopStock(count : Int) : (String, Double) = {
	(1 to count).foldLeft("", 0.0) { (previousHigh, index) =>
		receiveWithin(10000) {
			case (symbol : String, price : Double) =>
			if (price > previousHigh._2)
				(symbol, price)
			else
 				previousHigh
		}
	}
}

函数在Scala中是一等公民。不可变对象是函数式编程中的关键概念,在函数式编程中,函数是纯粹的,它的输出仅仅取决于输入,它们不能影响任何外部状态,也不受全局或本地的状态的影响。

Scala能让人改变编程的方式:更集中于思考如何将输入转换为输出。这减少了出错的机率,令代码更加模块化,更易于测试。

Related posts:

  1. Scala : 作用域中的变量,容器
  2. Scala : Partial Functions 和 Type Parameters
  3. Scala : Functions and Parameters
  4. Scala 集合框架:Tuple,Map[K,V],Option[T]
  5. Scala : Option 和 foldLeft
Categories: Scala Tags:
  1. scalaBoy
    August 26th, 2010 at 10:41 | #1

    def findMax(xs : List[Int]) = xs.max

    def fact(n: Int) = (1 to n).product

    ReplyReply
  2. leeing
    August 26th, 2010 at 12:40 | #2

    Good!

    ReplyReply
  1. No trackbacks yet.