|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是我同意你的观点,对于大型项目来说,应该是采用框架的一部分,根据功能的不同而改进,欢迎你能再提出些宝贵意见,我会多多学习的。说到jbuilder,我可能是个人感觉,用的时候确实没有vs爽,我最喜欢的IDE是net网页编程beans,谢谢。Scala分离了面向对象编程与函数编程头脑,利用一种可以完整兼容Java、能够运转在Java假造机上的、简便的语法。关于函数编程作风的撑持,特别是关于Lambda表达式的撑持,可以有助于削减必需要编写的逻辑有关流动代码,大概让它能够更复杂的存眷要面临的义务自己,而绝对的Java中对Lamdba表达式的撑持要到预定于2012年公布的JavaSE8才会完成。本文就是关于Scala先容。
作为第一步,先安装好最新的Scala公布包Typesafestack,翻开命令行窗口,键进“scala”:这会启动REPL(读进-运算输入轮回)交互式编码情况。然后你就能够写下你的第一行Scala代码:
scala>valcolumbus:Int=1492
columbus:Int=1492
我们方才声了然一个范例为Int的变量,初始值为1492,就像我们在Java里用语句Intcolumbus=1492;所做的一样。除把范例放在变量以后如许一种反向的声明体例以外,Scala在这里所体现出的分歧是利用“val”来显性地把变量声明为不成变。假如我们想要修正这个变量:- scala>columbus=1500<console>:8:error:reassignmenttovalcolumbus=1500^
复制代码 请注重毛病动静准确地指出了毛病位于行的哪一个地位。再实验声明这个变量,但这一次用“var”,让其可变动。如许编译器具有充足的智能来揣度出1492是一个整数,你也就不必要指定范例了:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=1500
复制代码 接上去,我们来界说一个类:- scala>caseclassEmployee(name:String="guest",age:Int=30,company:String="DevCode")definedclassEmployee
复制代码 我们界说了一个类,名为Employee,有三个不成变动的字段:name、age和company,各自有本人的缺省值。关头字“case”相称于Java里的switch语句,只不外要更加天真。它申明该类具有形式婚配的分外机制,和其他一些特征,包含用来创立实例的工场办法(不必要利用“new”关头字来机关),一样的也不必要创立缺省的getter办法。与Java中分歧的是,变量缺省下的会见把持是public(而不是protected),而Scala为公然变量创立一个getter办法,并定名为变量名。假如你乐意,你也能够把字段界说成可变且/或公有(private)的,只必要在参数之前利用“var”(比方:caseclassPerson(privatevarname:String))。
我们再来用分歧体例创立一些实例,看看其他的特征,像是定名参数和缺省参数(从Scala2.8入手下手引进):- scala>valguest=Employee()guest:Employee=Employee(guest,30,DevCode)scala>valguestAge=guest.age//(age变量的缺省getter办法)guestAge:Int=300scala>valanna=Employee("Anna")anna:Employee=Employee(Anna,30,DevCode)scala>valthomas=Employee("Thomas",41)thomas:Employee=Employee(Thomas,41,DevCode)scala>valluke=Employee("Luke",company="LucasArt")luke:Employee=Employee(Luke,30,LucasArt)scala>valyoda=luke.copy("Yoda",age=800)yoda:Employee=Employee(Yoda,800,LucasArt)
复制代码 不外,上面的写法- scala>valdarth=Employee("Darth","DevCode")<console>:9:error:typemismatch;found:java.lang.String("DevCode")required:IntErroroccurredinanapplicationinvolvingdefaultarguments.valdarth=Employee("Darth","DevCode")^
复制代码 是行欠亨的(可不是由于Darth不是DevCode的雇员!),这是因为机关函数在这个地位必要age作为参数,由于函数参数没有显性地举行定名。
如今我们再来看汇合,这才是真正让人镇静的中央。
有了泛型(Java5以上),Java能够遍历一个——例如说整数型列表,用上面如许的代码:- List<Integer>numbers=newarrayList<Integer>();numbers.add(1);numbers.add(2);numbers.add(3);for(Integern:numbers){System.out.println("Number"+n);}
复制代码 运转的了局是
Number1
Number2
Number3
Scala关于可变汇合和不成变汇合举行了体系性区域别处置,不外勉励利用不成变汇合,也因而在缺省情形下创立不成变汇合。这些汇合是经由过程摹拟的体例完成增加、更新和删除操纵,在这些操纵中,不是修正汇合,而是前往新的汇合。
与后面的Java代码等价的Scala代码大概像上面如许:- scala>valnumbers=List(1,2,3)numbers:List[Int]=List(1,2,3)scala>for(n<-numbers)println("Number"+n)Number1Number2Number3
复制代码 这里的“for”轮回语法布局十分靠近于Java的命令式编程作风。在Scala(和Java假造机上其他良多言语如:Groovy、JRuby或JPython)里另有别的一种体例来完成下面的逻辑。这类体例利用一种加倍倾向函数编程的作风,引进了Lambda表达式(偶然也称为闭包——closure)。复杂地说,Lambda表达式就是你能够拿来看成参数传送的函数。这些函数利用参数作为输出(在我们的例子中就是“n”整型变量),前往语句作为函数体的终极语句。他们的情势以下- functionName{input=>body}scala>numbers.foreach{n:Int=>//按回车键持续下一行|println("Number"+n)|}Number1Number2Number3
复制代码 下面的例子中,函数体只要一条语句(println……),前往的是单元(Unit,也就是“空了局”),也就是大抵相称于Java中的void,不外有一点分歧的是——void是不前往任何了局的。
除只打印出我们的数值列表之外,应当说我们更想做的是处置和变更这些元素,这时候我们必要挪用办法来天生了局列表,以便前面接着利用。让我们实验一些例子:- scala>valreversedList=numbers.reversereversedList:List[Int]=List(3,2,1)scala>valnumbersLessThan3=numbers.filter{n=>n<3}numbersLessThan3:List[Int]=List(1,2)scala>valoddNumbers=numbers.filterNot{n=>n%2==0}oddNumbers:List[Int]=List(1,3)scala>valhigherNumbers=numbers.map{n=>n+10}higherNumbers:List[Int]=List(11,12,13)
复制代码 最初的这一个变更“map”十分有效,它对列表的每个元素使用闭包,了局是一个一样巨细的、包括了每一个变更后元素的列表。
我们在这里还想先容最初的一个办法,就是“foldLeft”办法,它把形态从一个元素传布到另外一个元素。好比说,要算出一个列内外一切元素的和,你必要累加它们,并在切换元素的时分保留两头的计数:- scala>valsumOfNumbers=numbers.foldLeft(0){(total,element)=>|total+element|}sumOfNumbers:Int=6
复制代码 作为第一个变量传送给foldLeft的值0是初始值(也就是说在把函数用到第一个列表元素的时分total=0)。(total,element)代表了一个Tuple2,在Scala里这是一个二元组(就像要暗示三维空间坐标,常常要用到Tuple3(x,y,z)等等)。注重在算计时,Scala的编程接话柄际上供应了一个“sum”办法,如许上一条语句就能够写成:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15000
复制代码 另有很多其他的相似的汇合变更办法,你能够参照scaladocAPI。你也能够把这些办法组合起来(比方:numbers.reverse.filter……),让代码加倍简便,不外如许会影响可读性。
最初,{n=>n+10}还能够复杂地写成(_+10),也就是说假如输出参数只是用于你挪用的办法,则不必要声明它;在我们的例子里,“n”被称为匿名变量,由于你能够把它用任何情势来取代,好比说“x”大概“number”,而下划线则暗示一处必要用你的列表的每一个元从来弥补的空缺。(与“_”的功效相似,Groovy保存了关头字“it”,而Python则利用的是“self”)。- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15001
复制代码 在先容了对整数的基础处置后,我们能够迈进下一个阶段,看看庞大对象汇合的变更,比方利用我们下面所界说的Employee类:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15002
复制代码 从这个五个元素的列内外,我们能够使用一个前提来过滤出使用匿名办法后前往值为True的雇员,如许就失掉了——例如说属于DevCode的雇员:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15003
复制代码 假定我们手头的allEmployees汇合是我们利用SQL查询取得的了局集,查询语句大概相似于“SELECT*FROMemployeesWHEREcompany=‘DevCode’”。如今我们能够把List[Employee]变更到以company称号作为键、属于该公司的一切员工的列表作为值的Map范例,如许就能够把雇员按company来排序:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15004
复制代码 每个列表已作为一个值存进了(键——值)哈希表,为了树模怎样进一步处置这些列表,能够假想我们必要盘算每一个公司的雇员均匀岁数。
这详细意味着我们必需要盘算每一个列表的每一个雇员的的“age”字段的和,然后除以该列表中雇员的数目。让我们先盘算一下DevCode:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15005
复制代码 回到我们的Map(key:String->value:List[Employee]),上面是个加倍一样平常性的例子。我们如今能够合并并盘算每一个公司的均匀岁数,要做的只是写几行代码:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15006
复制代码 这里的“case(key,value)”申明了Scala供应的形式婚配机制是何等壮大。请参考Scala的文档来猎取更多的信息。
到这里我们的义务就完成了。我们完成的是一个复杂的Map-Reduce算法。因为每一个公司雇员的合并是完整自力于其他公司,这个算法十分直不雅地完成了并行盘算。
在前面的附录里给出了此算法的等价的完成,分为Java版本和Scala版本。
参考
Thetypesafestack.
附录
MapReduce:Java- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15007
复制代码 MapReduce.scala:- scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15008
复制代码 关于作者
<br>ThomasAlexandre是DevCode的初级征询参谋,专注于Java和Scala软件开辟。他酷爱手艺,热中于分享常识,永久在追求办法、接纳新的开源软件和尺度来完成加倍无效的编程。在十四年的Java开辟履历以外,已往几年他会合精神在新的编程言语和Web框架上,比方Groovy/Grails和Scala/Lift。Thomas从法国里尔年夜学取得了盘算机迷信博士学位,在卡耐基梅隆年夜学渡过了两年的博士后研讨生活,研讨偏向是平安和电子商务。
检察英文原文:AnIntroductiontoScalaforJavaDevelopers
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看net网页编程Beans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。 |
|