锁定老帖子 主题:Scala语言入门初探
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-09
我们先来安装Scala的开发包,我的版本是scala-2.9.0.1.zip,安装方式解压就可以,环境变量和Jdk的没什么区别,指向到bin目录下就可以了,打开dos窗口,运行scala,出现下面结结果就表示安装成功了 好了,让我们开始Scala之旅吧。 在Scala中,分号是可选的,你可以写或者不写;定义类和构造函数,Java中一般这么写 public class MyTest { private int id; private int index; public MyTest(int id, int index) { this.id = id; this.index = index; } } 而在Scala中,可以这么写 class MyTest(id: Int, index: Int) 除了这些特性,尤其值得一提的是Scala是静态类型的语言,它支持指令式的编程,但更推荐的使用函数式的编程。比如下面的代码 object HelloWorld { def main(args: Array[String]): Unit = { var i = 0 while(i < args.length) { println(args(i)) i += 1 } } } 我可以使用scalac HelloWorld.scala使他生成class字节码,也可以直接在JVM上执行, scala HelloWorld.scala Hello World 打印结果将是 Hello World 大家不觉得这样有一丁点儿复杂吗,来看看Scala的函数式的编程是什么样的 object HelloWorld { def main(args: Array[String]): Unit = { args.foreach(arg => print(arg + " ")) } } arg就是你临时定义的变量,Scala默认为其开辟了临时的String变量arg。 体验了最初的简单函数式风格,我们再看下Scala中如何使用数组,在Java中,使用一个最简单数组是这样的 public class ArrayTest { public static void main(String[] args) { String[] strs = new String[]{"Hello", "World", "!"}; for(String str : strs) { System.out.println(str); } } } 在Scala中,同样是通过new来实例化对象,实例化过程中,可以用值和类型使对象参数化,使用值参数化实例可以通过把值传递给构造器的圆括号来实现,比如,Scala中数组是这么实现的,值得一提的是,在Scala中,数组是可变数据结构,这是和Java中有区别的地方 object ArrayTest { def main(args: Array[String]): Unit = { var greetString = new Array[String](3) greetString(0) = "Hello" greetString(1) = "World" greetString(2) = "!" for(i <- 0 to 2) { println(greetString(i)) } } } i <- 这个表达式是表示左边的涵盖在右边范围之内。 下面我们来看看List,在Java中,List是可变的结构序列,而在Scala中,List是不可变的,在Scala中,List是不可变的数据结构,这么设计是为了函数式编程而设计的,奇特的是,Scala中并不需要通过new来创建List对象,比如下面一个例子,我创建了两个集合,并且把它们循环打印出来。 def main(args: Array[String]): Unit = { var list1 = List("aaa", "bbb", "ccc") var list2 = List("ddd") var list3 = list1 ::: list2 list3.foreach(list => print(list + " ")) } 打出的结果就是 aaa bbb ccc ddd 我们再来看看Set和Map,Scala致力于充分利用函数式和指令式两方面的好处,所以它的集合库区分为可变型和不可变型,都承接与Set,他们分别在Scala的不同包里。在Java中,我们称为“实现”了接口,而在Scala中,我们称为“扩展”或“混入”,下面我分别用Scala中的HashSet和HashMap的不可变数据类型,来做例子 object SetTest { def main(args: Array[String]): Unit = { var set = HashSet("b", 3, "c") set += "very" set.foreach(value => print(value + " ")) } } 这是Set的,下面是关于Map的 object MapTest { def main(args: Array[String]): Unit = { var map = HashMap(1 -> "a", 2 -> "b", 3 -> "c") map += (4 -> "d") map.foreach(value => print(value + " ")) } } Scala的程序,只要后缀名命名为.scala就可以了。同时Eclipse也内置了对Scala的支持,安装插件的网址是http://download.scala-ide.org/nightly-update-wip-experiment-2.9.0.final 大家可以自行安装,安装完后就可以在Eclipse中运行了,如下图 现在对函数式编程有个了最初体会了,呵呵,以后还会继续探讨关于Scala函数式编程带来的一些好处,大家相互学习,还请多多指教。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-09
最后修改:2011-06-09
这是闭包,其他语言如C#早有的东西。Scala的闭包写法和C#完全一样
new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }).ForEach(i=>Console.WriteLine(i)); |
|
返回顶楼 | |
发表时间:2011-06-09
ray_linn 写道 这是闭包,其他语言如C#早有的东西。Scala的闭包写法和C#完全一样
new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }).ForEach(i=>Console.WriteLine(i)); 没错,在运行时创建的函数值(对象)就是闭包,没学过C#,呵呵。 |
|
返回顶楼 | |
发表时间:2011-06-09
最后修改:2011-06-09
Scala好,主要是因为java的语法太烂,但是和C#比,Scala引入太多函数式的”污染“,个人不推崇纯函数式编程,最好只在特定环境中小规模使用。
|
|
返回顶楼 | |
发表时间:2011-06-17
为什么不能用 java 解释运行 scala生成的字节码
例如: java HelloWord |
|
返回顶楼 | |
发表时间:2011-06-18
ray_linn 写道 Scala好,主要是因为java的语法太烂,但是和C#比,Scala引入太多函数式的”污染“,个人不推崇纯函数式编程,最好只在特定环境中小规模使用。
Scala还不怎么算pure fp 我看F# 味道更重。 scala要是不想用fp,可以不用,不过这样还不如用java。 |
|
返回顶楼 | |
发表时间:2011-06-20
怎么没人用groovy么
|
|
返回顶楼 | |
发表时间:2011-06-20
groovy之父说 早知道有 Scala 这东西 他就不发明什么 groovy 了....
|
|
返回顶楼 | |
发表时间:2011-06-20
blue_halo 写道 为什么不能用 java 解释运行 scala生成的字节码
例如: java HelloWord 要带classpath,scala里有一个scala-library.jar,带上就行 |
|
返回顶楼 | |
发表时间:2011-06-21
scala跟什么静态语言的弊病怎么扯一块的,太不靠谱了吧
|
|
返回顶楼 | |