如何做好学生的引路人学好Scala

大数据学习之Scala的环境搭建和Hello World程序的实现(1)
Java JDK下载地址:
Scala下载地址:
Spark下载地址:
IDE下载地址:
注意:由于spark最新版本到笔者写博客之前是Spark
1.5.2 &而对应的Scala版本为Scala 2.10.X。所以这儿笔者下载的是Scala 2.10.6
首先JDK的安装方法笔者在这儿就不给于介绍了,网上已经有很多例子了。
将下载好的Scala双击安装到相应的目录下即可:
笔者安装目录。
接下来我们就进行Scala的环境配置,这一步大家一定要仔细认真。
首先进入到环境变量设置界面。
新建系统变量:
变量名:SCALA_HOME
变量值:D:\BigData\Scala
之后在系统变量中的path变量加入:&%SCALA_HOME%\bin 即可
之后我们运行cmd 输入 scala -version出现版本信息即表示我们安装成功,
自此我们就成功了一小半了
接下来我们就配置Scala的集成开发环境了
这儿我们选择的是Intellij&IDEA &当然你也可以选择Eclipse 但是后者没有前者对Scala支持得更好
将下载好的Intellij&IDEA双击安装到相应的目录下即可。
笔者目录:D:\BigData\Intellij&IDEA
创建项目:
选择Scala:
选择好之后:
当然你也可以下载Scala SDK,这儿我就用这个版本的了
自此我们就完成了所有的环境搭建了,现在就是编写代码了。激动的时刻到来了
新建包名,新建类名(选择object)。直接输入main就能智能提示,如下图
右键运行,即可看到第一个Scala程序
是不是很爽?到此所有的环境搭建,项目搭建就完了。如果有什么不懂,请留言!
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?博客分类:
1 简介
近期对Scala比较感兴趣,买了本《快学Scala》,感觉不错。比《Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine》好很多。 是本不错的入门书。而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法。
本文的目的就是针对这些习题进行解答
2.1 在Scala REPL中键入3,然后按Tab键。有哪些方法可以被应用?
这个。。。。直接操作一遍就有结果了.此题不知是翻译的问题,还是原题的问题,在Scala REPL中需要按3. 然后按Tab才会提示。 直接按3加Tab是没有提示的。下面是结果
asInstanceOf
isInstanceOf
|
列出的方法并不全,需要查询全部方法还是需要到Scaladoc中的Int,Double,RichInt,RichDouble等类中去查看。
2.2 在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?(提示:res变量是你的朋友)
依次进行计算即可
scala& scala.math.sqrt(3)
warning: there were 1
re-run with -deprecation for details
res5: Double = 1.8772
scala& res5*res5
res6: Double = 2.9996
scala& 3 - res6
res7: Double = 4.626E-16
2.3 res变量是val还是var?
val是不可变的,而var是可变的,只需要给res变量重新赋值就可以检测res是val还是var了
scala& res9 = 3
&console&:8: error: reassignment to val
2.4 Scala允许你用数字去乘字符串—去REPL中试一下"crazy"*3。这个操作做什么?在Scaladoc中如何找到这个操作?
scala& "crazy"*3
res11: String = crazycrazycrazy
从代码可以推断,*是"crazy"这个字符串所具有的方法,但是Java中的String可没这个方法,很明显。此方法在StringOps中。
2.5 10 max 2的含义是什么?max方法定义在哪个类中?
直接在REPL中执行
scala& 10 max 2
res0: Int = 10
scala& 7 max 8
res1: Int = 8
scala& 0 max 0
res2: Int = 0
可以看出,此方法返回两个数字中较大的那个。此方法Java中不存在,所以在RichInt中。
2.6 用BigInt计算2的1024次方
简单的API调用
scala& BigInt(2).pow(1024)
res4: scala.math.BigInt =
2.7 为了在使用probablePrime(100,Random)获取随机素数时不在probablePrime和Radom之前使用任何限定符,你需要引入什么?
so easy. import需要的包啊。Random在scala.util中,而probablePrime是BigInt中的方法,引入即可
import scala.math.BigInt._
import scala.util.Random
probablePrime(3,Random)
2.8 创建随机文件的方式之一是生成一个随机的BigInt,然后将它转换成三十六进制,输出类似"qsnvbevtomcj38o06kul"这样的字符串。查阅Scaladoc,找到在Scala中实现该逻辑的办法。
到BigInt中查找方法。
scala& scala.math.BigInt(scala.util.Random.nextInt).toString(36)
res21: String = utydx
2.9 在Scala中如何获取字符串的首字符和尾字符?
//获取首字符
"Hello"(0)
"Hello".take(1)
//获取尾字符
"Hello".reverse(0)
"Hello".takeRight(1)
2.10 take,drop,takeRight和dropRight这些字符串函数是做什么用的?和substring相比,他们的优点和缺点都是哪些?
查询API即可 take是从字符串首开始获取字符串,drop是从字符串首开始去除字符串。 takeRight和dropRight是从字符串尾开始操作。 这四个方法都是单方向的。 如果我想要字符串中间的子字符串,那么需要同时调用drop和dropRight,或者使用substring
浏览: 312739 次
来自: 南京
scala& def count(x:Double,n: ...
scala& def countdown(n:Int){ ...
可是奇慢无比啊,切换个页签得等一分钟啊!!!!!!!!
受教了, 今天我第一天遇到这个问题, 以前没想到fmt标签还跟 ...
都是栈里的拷贝
这句话让我从一头雾水到豁然开朗 谢谢了.
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'未来发展的潜力股大数据之Scala,学习机会不错过 !
未来发展的潜力股大数据之Scala,学习机会不错过 !
云图的世界
首先通过百度百科,咱们知道,Scala定义:Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的各种特性。数据类型是;Scala的函数定义:Scala的详细笔记:scala这门语言在大数据领域开发的两个非常伟大的框架sparkkafka分布式的、高吞吐量、高性能的 订阅 发布消息队列微信电信一、scala概述1、scala语言是集成了面向对象和函数式编程的各种特点2003发布了第一个基于java平台的版本 (基于.Net)scalable language优雅,简洁java中,一切皆对象函数式编程(链式编程):sc.textFile(&hdfs://hostname_namenode/path/.../input.txt&).flatMap((x)=&x.split(& &)) Array[String].map((x)=&(x,1)) Array[(String,Int)].reduceByKey((x,y)=&(x+y)) Array[(String,Int)].collect // action触发执行.flatMap(_.split(& &)) Array[String].map((_,1)) Array[(String,Int)].reduceByKey((_+_)) Array[(String,Int)].collect2、scala可以与java互操作scala与java共用JVM虚拟机平台scala使用scalac编译器将代码最终编译成 .class 结尾的字节码文件scala可以去调用所有java的类库java的程序中也可以直接写入一段scala代码3、函数式编程一切以函数、对象两方面为主函数可以理解为java中方法scala中函数是一等公民scala中函数可以当做一个参数去传递可以作为一个返回值返回可以在函数内部再定义一个函数4、学习的主要内容值与变量函数的定义循环和控制语句if elsewhileforbreak(重点讲解)元组的定义scala和python语句特有数组变长数组和定长数组集合ListSetMapscala中的类和object对象相关概念异常处理模式匹配功能更强大匹配的类型更多匿名函数高阶函数隐式转化trait接口功能比java的抽象类更强大重难点:scala环境的安装部署1、下载安装包 http://www.scala-lang.org/download/2.10.4.htmlwindow环境安装JDK解压scala安装包配置环境变量JAVA_HOME 对应你的安装路径SCALA_HOME 对应你的解压路径PATH=%JAVA_HOME%/%SCALA_HOME%/binlinux# tar zxf /opt/softwares/scala-2.10.4.tgz -C /opt/modules/# vi /etc/profileexport JAVA_HOME=/opt/modules/jdk1.7.0_67export SCALA_HOME=/opt/modules/scala-2.10.4export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin# source /etc/profile# scala -versionscala需要依赖jdk,所以java jdky一定要先配置好Scala的基本使用scala命令进入到交互式命令行hivehbasemysqlspark shellscala& val a=4a: Int = 4 //scala可以自动推断数据类型scala是一个强类型语言scala& a+5res0: Int = 9 //res0是系统自动给出的一个临时变量scala& println(&helloworld&)helloworldobject HelloWorld {def main(args:Array[String]){println(&hello world!! &)}# scalac HelloWorld.scala# scala HelloWorldjava中的主方法(程序的入口)public static void main(String args[]){window下配置安装IDEA工具点击安装包安装启动-configure-》plugin-》从磁盘找到插件-》重启settings工具字体设置apprance-》覆盖-》选择字体大小keymap-》eclipse 快捷键风格edit-》font-》save as-》选择字体大小scala中声明值的关键字val 声明的不可变变量不能重新赋值var 声明的可变变量可以重新赋值scala中定义一个变量的正规写法val a:Int=6关键字val/var 变量名:数据类型=值变量名写在数据类型前面,中间使用冒号分割数据类型首字母大写scala中变量需要初始化scala& var sex:String:7: error: only classes can have declared but undefined members(Note that variables need to be initialized to be defined)var sex:Stringscala的数据类型在scala中属于类,首字母大写scala中的lazy懒执行定义时不会立即执行,首次去调用相关变量时才真正的执行scala& lazy val price=1.8price: Double =def 函数名(参数):返回值类型 = {函数体def max(a: Int, b: Int):Int = { //可以不定义函数的返回值类型,可以自动推断if (a & b)aelsebmax(4,9)如何定义一个函数没有参数def add={ //当定义的函数没有参数时,括号可以省略println(&hello &)add //当定义函数时不带参数括号,那么调用该函数时也不能加括号,如果定义的无参函数带括号,那么调用该函数时的方法名后的括号可带可不带函数中定义函数def fun1(a:Int): Unit ={ //Unit在scala中表示无返回值def fun1(a: Int) = {def fun2(b: Int) = {println(&fun1+fun2=& + (a + b))fun2(100)fun1(200)scala交互式命令行的粘贴模式scala& :paste// Entering paste mode (ctrl-D to finish)代码ctrl-D结束匿名函数:scala& (x:Int)=& x+1函数有没有名称时,称这个函数为匿名函数(参数:类型, ,,) =& {方法体匿名函数才可以使用“ =& ”匿名函数的特点1、匿名函数可以赋值给另一个函数def min = (a:Int,b:Int)=&{if (a&b)2、匿名函数赋值给一个变量val add=(a:Int,b:Int)=& a+badd(3,6)3、一个函数如何赋值给一个变量def min(a:Int,b:Int)={val min1=min _ //函数名赋值给一个变量,scala语法规定,需要在函数名后加空格及占位符min1(4,8)scala中允许定义参数的缺省值(默认值)def path(p:String=&desttop&)={println(&the path is &+p)path(&D:/.../&)def loadConf(conf:String=&spark-default.xml&)={println(conf)loadConf(&spark-site.xml&)scala中使用*代表参数为重复参数,也叫变长参数def printName(name:String*)={name.foreach(x=&println(x))printName(&zhangsan&,&lili&)如果一个函数的参数也是一个函数的话,那么这个函数成为“高阶函数”foreach(x=&println(x)) -- 高阶函数x=&println(x) -- 匿名函数val arr = Array(&zhaoliu&,&lisi&)printName(arr: _*) //如何将数组作为一个变长参数传入函数中一、scala中的控制语句类似javawhile 循环条件在循环体的前面do while 循环条件在循环体的后面,至少执行一次循环体break 终止跳出循环for 可用while循环替代1、在scala中如何使用break语句1)创建一个Breaks实例2)循环体需要定义在Breaks实例的breakable 方法体中3)在循环体内使用该实例的 break()import scala.util.control.Breaksobject LoopTest {def main(args: Array[String]) {val list = List(1, 2, 4, 6, 8)val b = new Breaks //创建实例b.breakable {//调用Breaks实例的breakale 方法for (x &- list) {println(x)if (6 == x)b.break() //在循环体中调用Breaks实例的break()方法println(&over......&)2、scala中的循环表达式1 to 101.to(10)包头包尾1 until 101.until(10)包头不包尾Range(1,10)Range(1,-10,-1) 步长循环表达式结合for循环使用for(x&- 1.until(6)){求0-10之间的偶数for(x &- 1.to(10) if x%2==0){ //添加一个过滤 判断二、scala中的元组 Tuple1、如何去定义一个元组val tuple=(2,5,8,&aa&,4.1)2、元组的特点scala和python共用的scala中,元组就是n个不同类型的对象的一个聚集Map集合的元素,其实是n=2个对象的聚集,2元组,也是最简单的元组定义元组必须使用圆括号取元组的值,方法是 tuple._角标 ,下角标从1开始目前scala支持的n个最大个数是213、如何去遍历元组for ( x &- 0 until tuple.productArity){println(tuple.productElement(x))override def productElement(n: Int) =n match {case 0 =& _1case 1 =& _2case 2 =& _3case 3 =& _4case 4 =& _5case _ =& throw new IndexOutOfBoundsException(n.toString())三、数组1、scala中数组的特点:数组的相同类型的固定大小的元素的连接集合数组的索引 从 0开始数组是最基本的数据结构定义数组时不用new 关键字,因为调用了Array伴生对象的里面的apply方法2、定义一个数组val arr=Array(2,8,7,8) //默认创建的数组是定长数组arr(0) //数组的取值,下角标从0开始创建一个空的数组val arr1=new Array[Int](5)arr1(2)=9 //为脚本为2的元素赋值arr13、数组的遍历val arr=Array(2,8,7,8)方法一:for (index &- 0 until(arr.length)){println(arr(index))方法二:for(element&-arr){println(element)4、变长数组如何定义1)val arr=scala.collection.mutable.ArrayBuffer(1,2,3)2)import scala.collection.mutable.ArrayBuffer //未被调用前是灰色的val arr=ArrayBuffer(1,2,6)添加或删除元素arr+=8arr+=(11,31)val arr1=Array(1,1,0)arr++=arr1 //添加一个数组arr-=8变长数组常用的方法inster remove trimEnd(2) toArray sum max ....arr.toArray 返回的是一个定长数组,后面可以直接紧跟调用定长数组特有方法,原arr变长数组并没有根本上转化成定长数组5、数组其他的方法排序scala.util.Sorting.quickSort(arr.toArray) //对定长数组的排序转化成字符串arr.mkString(&,&)arr.mkString(&(&,&,&,&)&)res0: String = 1,2,6,8res1: String = (1,2,6,8)四、集合1、特点scala中所有的集合的类包都在scala.collectionIterable是所有可遍历的集合的父类,它提供了一个迭代方法 foreachscala的集合分为可变集合和不可变集合可变集合scala.collection.mutable可以修改,添加,删除等操作在原来集合的基础上进行的更新操作不可变集合scala.collection.immutable可以模拟修改,添加,删除等操作每次操作后,都会生成新的集合,原来的集合依然存在且元素没有改变2、list集合1)定长list集合val list=List(2,3,5,5,8)list.head 取第一个元素list.tail返回值是一个集合,除第一个元素外的元素的集合Nil 是一个空的list集合总结:一个list集合是由head 和tail组成添加元素val list1=10::listval list1=10::12::14::listval list2=11::17::Nil //list2: List[Int] = List(11, 17)总结:只能将元素写到集合的前面,元素会插入到集合的头部2)变长list集合定义val list=scala.collection.mutable.ListBuffer(2,4,6,7)添加、删除元素(类似变长数组) +=/-=/++=/--=list+=3list+=(9,7,6,4)。。。结论:每次操作后,都会生成新的集合,原来的集合依然存在且元素没有改变变长list集合转化为定长list集合或Array数组list.toList 转化后可以使用定长list集合的方法list.toArray 。。。。。list集合的遍历for(x&-list){其他常见方法list.exists((x:Int)=&x&5)list.exists(_&5)list.filter(_&5)3、Set集合无序不重复1)定长set集合与List对比,Set集合可以使用++ - -- 这些操作符,每次都是生成新的set集合基本定义val set=Set(1,4,5,8)基本操作set+10set+11+12+14set+(16,17)set++Set(21,22)结论:set的不可变基本可以使用++ + - -- 符号进行增减元素,而list的定长集合不能使用(::)2)变长set集合可以使用++= += -= --=进行操作,在原集合的基础上进行的更新操作(等号相当于覆盖)val set1=scala.collection.mutable.Set(3,4,6,8)操作参考list3)有序的Set集合val set2=scala.collection.SortedSet(3,4,6,8,1)4、Map集合1)不可变map集合不可以更新值或增减元素val map=Map(&zhangsan&-&18,&lisi&-&16,&lili&-&19)map(&lisi&)map.getOrElse(&lilil&,-1) //这种取值方法更安全2)可变集合val map1=scala.collection.mutable.Map(&zhangsan&-&18,&lisi&-&16,&lili&-&19)map1(&zhangsan&)=19 //更新valuemap1(&lio&)=1 //添加元素map1+(&zhang&-&18) // 添加元素,生成一个新的map集合map1+=(&zhang&-&18) //添加元素,原集合基础上进行更新操作3)map集合的遍历for ((key,value)&-map1){println(&key is &+ key +&, value is &+ value)for(key&-map1.keySet){println(&key is &+ key +&, value is &+ map1.getOrElse(key,-1))方法三:for((key,_)&-map1){方法四:(只获取value)for(value&-map1.values){println(&value is &+value)想咨询更多内容,可加群(Q):
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
云图的世界
百家号 最近更新:
简介: 关注消费领域数码科技最前沿资讯!
作者最新文章如何学好Scala?请给出一条科学的时间线 - 知乎1933被浏览95879分享邀请回答twitter.github.io/scala_school/zh_cn/ ),以及国人的一个教程(
)。看这两个入门教程的时候,遇到难点难以理解的时候需要祭出Martin Odersky写的权威教程scala编程(
)。两边参考下,很快就能对scala有基本的认识。接下来就是实操项目,或者去读读源码,看到不明白的写法就翻翻权威教程。遇到完全出乎意料的写法时不要灰心 ,一开始看不懂scala代码是正常的。scala本身核心理念很简单,只是由于强大的设计,让scala具备了写出各种dsl的能力,而dsl的样子差异很大,所以让人觉得scala千变万化。抓住参数类型、返回值类型,留意这些类型实现了什么trait,是否有隐式转换。就能逐渐摸通代码的逻辑。迷茫的时候,看看此blog或许会有收获。 3437 条评论分享收藏感谢收起/watch?v=ZR3Jirqk6W8国内过于倾向C/C++,导致大部分人固定在了过程化编程的思维模式中。Scala是函数式编程,函数式(Functional)编程和命令式(Imperative)编程几乎是对立的。如果你把函数式程序员和命令式程序员放在一个房间里,他们恐怕会直接打起来。在蒙特利尔举办的一次Scheme(这是Lisp的一门方言)大会上,曾经有个可怜家伙提及SSA风格(SSA是将命令式语言编译成中间语言的一种格式),奥林·希瓦斯在那个"A"字还没说出来之前就冲上去质问一声:“你是指CPS吧!?”(CPS是函数式语言编译成中间语言时用的风格)台下一阵暗笑。这个故事的英文如下,翻译略有纰漏请见谅:At the last Scheme workshop in Montreal, some poor fellow had the temerity to mention SAA on stage.
(SSA is what the "machine tribe" uses as an intermediate langauge in their compilers.)
I don't think the "A" was out of his mouth before Olin Shivers' booming drawl started, "d'you mean CPS?"
(CPS is what "we" use.)
There were titters from the audience, myself included. 原文链接在此:所以我的建议是,不需要真正去学一门函数式语言,只要了解它就好了。知道这一派程序员的作风,慢慢喜欢上这样一个程序世界的分支。很多函数式程序员都非常的屌,比如Wingolog,他一直作为函数式语言Scheme的支持者,参加过很多次重要的会议,他在一篇讨论JavaScript V8引擎的博文内写了这样一句笑话:In the beginning was the .
God saw it, realized he didn't need anything else, and stopped there. (太初有拉姆达表达式。上帝看见了它,意识到他再也不需要其他任何东西,就停在那里了。)—— 这篇博文的前半部分略微介绍了一下函数式编程文化,非常有趣。凡是学过函数式语言的人都对其赞不绝口,再回到Java或是C++一类的语言,会觉得受到窒息束缚一般的厌恶。最重要的,是用函数式语言写程序的人总会感受到快乐(Fun),所以学习函数式语言是非常值得的——虽然刚开始必定会有很多困难,但非常值得。用中文学习Scala未尝不可,但Scala在国外的书籍都不算特别多,翻译到国内来的几乎没有(如果有的话请告知)。但尽管如此,还是有不少的博客学习资源。比如宏江的博客: 如果仔细搜一下中文资源必定还是有很多的,还有这个github上的带Scala在线编译器的教程。如果英文水平很好,并且有比较好的Java,C/C++功底,大可以直接阅读这本神作:Scla for the Impatient(给不耐烦的人写的Scala),可以在这里下载: 。这本书看名字仿佛非常肤浅,但实际作者Cay Horstmann是拿着数学博士学位,正在大学教计算机的教授,英文用得亲和易懂,非常便于阅读。对比Martin Odersky写的艰涩著作Programming in Scala要好上很多。Scala是一门很深的语言,但开始上路并不需要太多艰深的知识。Martin Odersky 把Scala的知识分成了两个部分,制作了这个表格:使用者
库开发者A1A2
L3其中A2对应L1,A3对应L2,L3独树一帜处于境界最高点。纵向的排名是难度排名。所以虽然Scala知识多,但并不必要一朝而就,全部学完了才开始编程,大可以从使用者的知识点开始学习,再慢慢过度成一位库开发者。 和
已经把Scala的知识点详细的划分到这几个大类下了。有些人还会建议去学马丁·奥德斯基在Coursera上面那堂著名的Functional Programming课。我非常不推荐。马丁·奥德斯基的英文并不好,而且又没有激情,跟个机器人一样(远不如他在很多Scala大会上的表现)。那门课和Scala关系不大,和函数式编程关系略大一些,而且非常偏理论。对于新手其实并不友好。学习一门语言,就算学Scala这样高大上的语言,实践总是最好的。为什么PHP非常流行?因为它非常简单,而且有很多关于“实践”的教程,比如如何用PHP写一个博客。人人都懂博客,人人都用博客,所以PHP很快就在实践步伐中普及开了,JavaScript也是同一个道理。用Scala来做项目,才是学习Scala的最好渠道。在这里不得不推荐Scala的两个做项目必备的套件:Play Framework(模仿Ruby on Rails的网络开发套件,官方宣传语是“高速度针对Java和Scala的网络框架”—)Play有非常好的教程,一边学Scala的语言特性,一边用Play来开发一个小博客或者小网站,岂不是非常好?第二个是,任何做网站的人都会用到ORM,Play框架也不例外。把Play和Slick这样类似ORM的数据库操作工具(Slick开发团队拒绝被称作ORM)放在一起使用,也是非常惬意的。Slick 团队想将其称为FRM(Functional Relational Mapping),其本身其实是一个Scala语言编译器,将特定的Scala语言理解后编译成对应的SQL语言,而不是简单的ORM那样,建立一个Car对象后就可以car.save()。所以总结一下,先了解什么是函数式语言,大致了解即可,主要知道圈内人的风格(非常屌),知道函数式语言与过程式语言的优劣区别,然后通过一些渠道了解Scala的基础知识,最后用上Play框架,写一个自己的博客吧!边学边用才是唯一的方法呐。况且,也不是每个人都适合学Scala的,这篇博文很详细的指出,至少50%的Java开发者都不适合学Scala。 这位DPP仁兄(CEO of ),作为Scala教育的普及者和先行者说:对于50%的Java开发者,学习Scala的难度高于它带来的便捷。他说如果把上面的句子换成:对于50%的PHP开发者,学习Java的难度高于它带来的便捷,恐怕就没有什么人有异议了。------------------------------附录:如果想学Haskell,推荐这个网站Learn you a Haskell for Greater Good(为大义而学Haskell): 本身是一本书,但有一个配套网站,免费把书的内容公开出来了,画了一堆可爱的小动物,很多人的Haskell起步都是从这里开始的。 附录2:我之前给Scala写了一个入门指南,直接用JS幻灯片的方式写的,所以可以直接放到网站上。但一直没有机会,也不知道以后有机会没有。如果有的话,会在这里更新一个网址的。但如果有兴趣,可以看看github下的md: (我的Github很混乱,远不能和很多大神相比,所以请各种见谅)43831 条评论分享收藏感谢收起查看更多回答4 个回答被折叠()中国领先的IT技术网站
51CTO旗下网站
十二步学会Scala(1):从下载安装到定义方法
本篇是一个Scala快速入门,旨在step by step帮助读者快速完成Scala的上手步骤。全文计划分为十二步骤,本文是前四个,介绍了从下载到定义方法的内容。
作者:alanwu来源:JavaEye博客| 09:55
Scala教程现在网络上不算特别多,但也不少了。alanwu撰写本篇的目的在于提供一个Scala快速入门,这样大家可以先很快的上手,以后再慢慢熟悉这门语言。
原文地址: | 51CTO编辑推荐:
本Scala快速入门参考了《》的内容。下面开始:
我先大致根据这篇文章写一些自己的理解,让想学Scala的同学有个感性认识。
读者对象:有Java经验的工程师
第一步:下载和安装Scala
在并接压缩,像安装ANT或MAVEN之类的那样,把解压后的bin路径加到path里面去就可以了。
在命令行模式下输入Scala
cmd 写道C:\Documents&and&Settings\&scala &Welcome&to&Scala&version&2.7.5.final&(Java&HotSpot(TM)&Client&VM,&Java&1.6.0_13) &. &Type&in&expressions&to&have&them&evaluated. &Type&:help&for&more&information. &&scala& &&
如果你看到scala提示符,那么恭喜你,说明Scala安装成功了。
第二步:学习使用Scala解释器(interpreter)
Scala也算是解释性语言,所以你可以直接与解释器交互。
cmd 写道scala&&1&+&3&res0:&Int&=&4&&scala& &&
直接输入 1 + 3 ,返回res0: Int = 4
res0表示变量名, Int表示类型, 4是值。
Scala的类型定义在冒号后面,和java放在前面不同,和UML类图的属性定义方式一样。
Scala是强类型语言,必须要定义类型,但Scala编译器足够聪明,他能够根据你的值帮你定义变量的类型。
这里res0是个变量名,所以你可以接下来再使用。
cmd 写道scala&&res0&*&3&res1:&Int&=&12&&scala& &&
解释器又给了一个变量res1。
Scala的所有变量都是对象,所有操作都是方法。
所以*也是方法,你可以这样调用:
cmd 写道scala&&res0.*(res1) &res2:&Int&=&48&&scala& &&
这个和java很不同,java的int不是对象。
是不是有点绕进去了,那么来个hello world宣告第二步结束。
cmd 写道scala&&println("Hello&World!") &Hello&World! &&scala& &&
这个println是个方法,因为Scala有预定义导入一些类,所以可以直接使用。
因为Scala更新很快,每个版本的Scala的解释器可能都有一些不同,所以如果返回的变量名或有其他有一点不一样,请不要太奇怪。
第三步: 定义变量
写程序最入门就是定义变量和方法,前面的变量由Scala解释器自动定义了,这一步自己定义变量。
Scala有两种类型的变量,val 和var 。 val 变量的值只能初始化一次,再次赋值就发生错误,var就和java的变量相同,可以随时修改。
val 是函数式编程的风格,变量一旦赋值就不要再做修改,从程序上将有很多好处,但有时候做起来会比较绕。
cmd 写道scala&&val&msg&=&"Hello&World!"&msg:&java.lang.String&=&Hello&World! &&scala&&msg&=&"Hello&JavaEye"&:5:&error:&reassignment&to&val &msg&=&"Hello&JavaEye"&^ &&scala& &&
Scala是强类型语言,每个变量都需要类型。但如果你赋给变量的有足够明细的类型提示,那么编译器会帮你把类型加上去。
把刚才的msg打印出来
cmd 写道scala&&println(msg) &Hello&World! &&scala& &&
再来看看var ,比较好理解。
cmd 写道scala&&var&greeting:&String&=&"Hello&World!"&greeting:&String&=&Hello&World! &&scala&&println(greeting) &Hello&World! &&scala&&greeting&=&"Hello&World!"&greeting:&String&=&Hello&World! &&scala&&println(greeting) &Hello&World! &&scala& &&
记住,Scala有两种变量标识,和java不一样。
第四步: 定义一些方法
以前程序就是变量和方法组成吧,所以变量和方法是最基础的东西。
我们定义一个取最大值的方法max
cmd 写道scala&&def&max(x:&Int,&y:&Int):&Int&=&if(x&&&y)&y&else&x &max:&(Int,Int)Int &&
定义变量用val和var,定义方法用def 。
这个max方法有方法参数,返回值类型,方法体。麻雀虽小,五脏俱全了。
Scala的变量表示是变量名: 类型 ,这一点和java甚至其他语言都很不同,和UML风格比较接近。
调用方法很简单:
cmd 写道scala&&max(3,8) &res9:&Int&=&8&&
Scala中方法也是一个类型,或者说是一个值,成为First Class。
所以可以把max看成是个变量名,(Int,Int)Int是它的类型。他可以作为参数传递,也可以赋值给其他变量。
cmd 写道scala&&val&m&=&max&_ &m:&(Int,&Int)&=&&Int&=& &
将max赋值给m, 请注意max后面带的下划线,不要忘记写了。调用m
cmd 写道scala&&m(1,3) &res11:&Int&=&3&&scala& &&
在初学的时候就讲这个好像有点急进了,不太容易理解,不过没关系,先了解一下总比看到后莫名其妙好。
OK,本篇到此结束。本Scala快速入门系列计划通过十二步完成,现在进展到了第四步。后续内容敬请期待!
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点原创热点头条头条
24H热文一周话题本月最赞
讲师:108848人学习过
讲师:30863人学习过
讲师:15042人学习过
精选博文论坛热帖下载排行
《程序员密码学》涉及密码学的各个研究方向,分组密码、散列函数、公钥密码以及相关的攻击,同时也讲解了密码学算法实现上常用的ASN.编码、...
订阅51CTO邮刊

我要回帖

更多关于 如何学好英语 的文章

 

随机推荐