`
fengfeng925
  • 浏览: 107906 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala语言入门初探

阅读更多
    用Java语言开发许久了,一直接触指令式的语言开发,同时也做的多了,也逐渐感觉到了静态语言的一些弊病。Scala的出现,可以使Java程序员平滑的过度,Scala语言也是运行在JVM上的,可以与Java无缝交互;Scala是面向对象的,可以通过提升接口的抽象级别来帮助管理复杂性。Scala是简洁的,Scala程序员曾报告说,与Java比起来,它的代码行数可以减少到Java的1/10,哈哈,是不是有些夸张呢?个人觉得,如果能减少三分之一,就非常成功了;Scala是静态的,它以Java的内嵌类型系统为基础,允许使用泛型参数化类型,用交集组合型类型和抽象类型隐藏实现细节,从而能够设计出安全而又能灵活使用的接口。

    我们先来安装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函数式编程带来的一些好处,大家相互学习,还请多多指教。
  • 大小: 8.4 KB
  • 大小: 17.6 KB
分享到:
评论
13 楼 jilen 2011-06-24  
scala是静态类型,但是有类型推断,所以可以减少很多累赘代码。通常静态类型语音代码有很多累赘的类型信息。
开始我也感觉到scala好像是个不伦不类的怪物,即不像erlang,lisp那么纯粹functional,又不是那么单纯的命令式,感觉有许多稀奇古怪的特性。不过现在又感觉scala对象模型和函数式编程结合的还是很完美的,martin也是坚信这一点才创造这个东西
12 楼 jilen 2011-06-24  
scala确实很不错。闭包和函数是第一类值这些思想是函数式编程语音的特点。scala了对象模型也比较不错,是我喜欢的类型。模式匹配之类的特性可以让代码更优雅。
11 楼 wanbin021614 2011-06-22  
这个我觉得自己玩玩就好 企业级的应用 java还是主流
10 楼 izat 2011-06-21  
netfishx 写道
scala跟什么静态语言的弊病怎么扯一块的,太不靠谱了吧

同上,不过楼主貌似也知道scala是静态的,这逻辑呀。
9 楼 netfishx 2011-06-21  
scala跟什么静态语言的弊病怎么扯一块的,太不靠谱了吧
8 楼 ariestiger 2011-06-20  
blue_halo 写道
为什么不能用 java 解释运行 scala生成的字节码

例如: java HelloWord

要带classpath,scala里有一个scala-library.jar,带上就行
7 楼 happysoul 2011-06-20  
groovy之父说 早知道有 Scala 这东西 他就不发明什么 groovy 了....
6 楼 guilipan 2011-06-20  
怎么没人用groovy么
5 楼 mathgl 2011-06-18  
ray_linn 写道
Scala好,主要是因为java的语法太烂,但是和C#比,Scala引入太多函数式的”污染“,个人不推崇纯函数式编程,最好只在特定环境中小规模使用。


Scala还不怎么算pure fp

我看F# 味道更重。

scala要是不想用fp,可以不用,不过这样还不如用java。
4 楼 blue_halo 2011-06-17  
为什么不能用 java 解释运行 scala生成的字节码

例如: java HelloWord
3 楼 ray_linn 2011-06-09  
Scala好,主要是因为java的语法太烂,但是和C#比,Scala引入太多函数式的”污染“,个人不推崇纯函数式编程,最好只在特定环境中小规模使用。
2 楼 fengfeng925 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#,呵呵。
1 楼 ray_linn 2011-06-09  
这是闭包,其他语言如C#早有的东西。Scala的闭包写法和C#完全一样

new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }).ForEach(i=>Console.WriteLine(i));

相关推荐

    Android 开发从入门到精通

    随着Android生态系统的成熟,开发者不再局限于传统的Java编程语言,Scala等更现代化、类型安全的语言逐渐受到青睐。通过本文,读者将学习如何将Scala融入Android开发,利用其更强大的表达能力和类型安全性,提升应用...

    基于Android的应用软件开发实例初探.doc

    2.1.1 Simple:虽然Simple不是主流的Android开发语言,但它是为简化编程而设计的一种语言,适合初学者快速入门。 2.1.2 Scala:Scala是一种多范式编程语言,它集成了面向对象和函数式编程的特点。虽然使用Scala开发...

    函数式编程初探共2页.pdf.zip

    还有一些语言虽然不是纯函数式的,但支持函数式编程特性,如Python、JavaScript和Scala。 9. **monads(范畴论)**:在高级函数式编程中,monads是一个重要的概念,它们提供了一种管理副作用的抽象方式。虽然这个...

    javaee电子商城系统课程设计样本.doc

    javaee电子商城系统课程设计样本.doc

    scratch少儿编程逻辑思维游戏源码-糖果大爆险.zip

    scratch少儿编程逻辑思维游戏源码-糖果大爆险.zip

    spring-boot-2.7.2.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-1.3.6.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    GIS安装施工综合方案.doc

    GIS安装施工综合方案.doc

    基于PHP+CSS+JS+MySQL的选题系统源码——B/S架构下多角色登录与权限管理

    内容概要:本文详细介绍了选题系统源码,涵盖PHP、CSS、JavaScript和MySQL四种核心技术。系统采用B/S架构,支持管理员、审核员、教师和学生四种身份登录,每种身份有独立的功能权限。文中提供了详细的环境搭建指南,如使用phpStudy和Navicat进行项目管理和数据库操作。此外,还展示了关键代码片段,如登录验证、权限管理、数据库设计以及界面优化方法。同时,针对性能优化提出了建议,如解决N+1查询问题的方法。 适合人群:适用于有一定编程基础,尤其是对PHP和Web开发感兴趣的开发者和技术爱好者。 使用场景及目标:① 学习并掌握B/S架构的应用开发流程;② 实践多角色登录和权限管理的具体实现;③ 提升Web应用的界面优化和用户体验;④ 掌握数据库设计和性能优化技巧。 其他说明:本文不仅提供了完整的代码示例,还包括了详细的开发文档和支持材料,帮助读者快速上手并深入理解整个项目的构建过程。

    scratch少儿编程逻辑思维游戏源码-下水道冒险猫.zip

    scratch少儿编程逻辑思维游戏源码-下水道冒险猫.zip

    scratch少儿编程逻辑思维游戏源码-下雨时向北的路.zip

    scratch少儿编程逻辑思维游戏源码-下雨时向北的路.zip

    三相下垂双逆变器同步并联控制技术的研究与应用

    内容概要:本文深入探讨了三相下垂双逆变器同步并联控制技术,重点介绍了下垂控制的基本原理及其在微电网中的应用。文章详细解释了下垂控制如何通过调整频率和电压幅值来实现负载的自动分配,并讨论了在多台逆变器并联时可能出现的环流问题以及解决方案,如虚拟阻抗法。此外,还介绍了同步环节的关键技术,特别是改进型锁相环的应用,并提供了具体的实现代码示例。最后,文章分享了一些实用的调试技巧和经验,强调了参数整定的重要性。 适用人群:从事电力电子、微电网控制领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解三相下垂双逆变器同步并联控制技术的工程师和科研人员,旨在帮助他们掌握核心技术,解决实际工程中的问题。 其他说明:文中提供的代码示例和调试方法有助于读者更好地理解和应用相关技术,提高系统的稳定性和性能。

    spring-data-redis-1.2.1.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    GEPLC机组自动化装置编程使用说明书.doc

    GEPLC机组自动化装置编程使用说明书.doc

    scratch少儿编程逻辑思维游戏源码-我的领土.zip

    scratch少儿编程逻辑思维游戏源码-我的领土.zip

    spring-boot-1.3.3.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-我的世界 MMO V1.6.zip

    scratch少儿编程逻辑思维游戏源码-我的世界 MMO V1.6.zip

    scratch少儿编程逻辑思维游戏源码-坦克(1).zip

    scratch少儿编程逻辑思维游戏源码-坦克(1).zip

    GSM移动通信网容量解决方案.doc

    GSM移动通信网容量解决方案.doc

    scratch少儿编程逻辑思维游戏源码-天台狂飙.zip

    scratch少儿编程逻辑思维游戏源码-天台狂飙.zip

Global site tag (gtag.js) - Google Analytics