仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 614|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA教程之向Java开辟者先容Scala仓酷云

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:31:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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”来显性地把变量声明为不成变。假如我们想要修正这个变量:
  1. scala>columbus=1500<console>:8:error:reassignmenttovalcolumbus=1500^
复制代码
请注重毛病动静准确地指出了毛病位于行的哪一个地位。再实验声明这个变量,但这一次用“var”,让其可变动。如许编译器具有充足的智能来揣度出1492是一个整数,你也就不必要指定范例了:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=1500
复制代码
接上去,我们来界说一个类:
  1. 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入手下手引进):
  1. 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)
复制代码
不外,上面的写法
  1. 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能够遍历一个——例如说整数型列表,用上面如许的代码:
  1. 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代码大概像上面如许:
  1. 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”整型变量),前往语句作为函数体的终极语句。他们的情势以下
  1. functionName{input=>body}scala>numbers.foreach{n:Int=>//按回车键持续下一行|println("Number"+n)|}Number1Number2Number3
复制代码
下面的例子中,函数体只要一条语句(println……),前往的是单元(Unit,也就是“空了局”),也就是大抵相称于Java中的void,不外有一点分歧的是——void是不前往任何了局的。
除只打印出我们的数值列表之外,应当说我们更想做的是处置和变更这些元素,这时候我们必要挪用办法来天生了局列表,以便前面接着利用。让我们实验一些例子:
  1. 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”办法,它把形态从一个元素传布到另外一个元素。好比说,要算出一个列内外一切元素的和,你必要累加它们,并在切换元素的时分保留两头的计数:
  1. 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”办法,如许上一条语句就能够写成:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15000
复制代码
另有很多其他的相似的汇合变更办法,你能够参照scaladocAPI。你也能够把这些办法组合起来(比方:numbers.reverse.filter……),让代码加倍简便,不外如许会影响可读性。
最初,{n=>n+10}还能够复杂地写成(_+10),也就是说假如输出参数只是用于你挪用的办法,则不必要声明它;在我们的例子里,“n”被称为匿名变量,由于你能够把它用任何情势来取代,好比说“x”大概“number”,而下划线则暗示一处必要用你的列表的每一个元从来弥补的空缺。(与“_”的功效相似,Groovy保存了关头字“it”,而Python则利用的是“self”)。
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15001
复制代码
在先容了对整数的基础处置后,我们能够迈进下一个阶段,看看庞大对象汇合的变更,比方利用我们下面所界说的Employee类:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15002
复制代码
从这个五个元素的列内外,我们能够使用一个前提来过滤出使用匿名办法后前往值为True的雇员,如许就失掉了——例如说属于DevCode的雇员:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15003
复制代码
假定我们手头的allEmployees汇合是我们利用SQL查询取得的了局集,查询语句大概相似于“SELECT*FROMemployeesWHEREcompany=‘DevCode’”。如今我们能够把List[Employee]变更到以company称号作为键、属于该公司的一切员工的列表作为值的Map范例,如许就能够把雇员按company来排序:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15004
复制代码
每个列表已作为一个值存进了(键——值)哈希表,为了树模怎样进一步处置这些列表,能够假想我们必要盘算每一个公司的雇员均匀岁数。
这详细意味着我们必需要盘算每一个列表的每一个雇员的的“age”字段的和,然后除以该列表中雇员的数目。让我们先盘算一下DevCode:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15005
复制代码
回到我们的Map(key:String->value:List[Employee]),上面是个加倍一样平常性的例子。我们如今能够合并并盘算每一个公司的均匀岁数,要做的只是写几行代码:
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15006
复制代码
这里的“case(key,value)”申明了Scala供应的形式婚配机制是何等壮大。请参考Scala的文档来猎取更多的信息。
到这里我们的义务就完成了。我们完成的是一个复杂的Map-Reduce算法。因为每一个公司雇员的合并是完整自力于其他公司,这个算法十分直不雅地完成了并行盘算。
在前面的附录里给出了此算法的等价的完成,分为Java版本和Scala版本。
参考

Thetypesafestack.
附录

MapReduce:Java
  1. scala>varcolumbus=1492columbus:Int=1492scala>columbus=1500columbus:Int=15007
复制代码
MapReduce.scala:
  1. 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优点之一。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-21 09:32:26 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
谁可相欹 该用户已被删除
板凳
发表于 2015-1-27 07:10:25 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
飘灵儿 该用户已被删除
地板
发表于 2015-1-27 16:32:55 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
因胸联盟 该用户已被删除
5#
发表于 2015-1-29 11:29:20 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
透明 该用户已被删除
6#
发表于 2015-2-2 17:51:48 来自手机 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
小妖女 该用户已被删除
7#
发表于 2015-2-8 03:04:45 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
活着的死人 该用户已被删除
8#
发表于 2015-2-11 09:01:54 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
再现理想 该用户已被删除
9#
发表于 2015-2-14 05:19:52 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
兰色精灵 该用户已被删除
10#
发表于 2015-3-4 04:52:12 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
小魔女 该用户已被删除
11#
发表于 2015-3-6 15:16:29 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
只想知道 该用户已被删除
12#
发表于 2015-3-13 03:07:07 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
柔情似水 该用户已被删除
13#
发表于 2015-3-19 08:30:02 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
再见西城 该用户已被删除
14#
发表于 2015-3-21 02:02:54 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
乐观 该用户已被删除
15#
发表于 2015-3-22 17:10:58 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
若相依 该用户已被删除
16#
发表于 2015-3-24 22:31:11 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
海妖 该用户已被删除
17#
发表于 2015-4-4 06:10:53 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
灵魂腐蚀 该用户已被删除
18#
发表于 2015-4-15 12:59:09 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
admin 该用户已被删除
19#
发表于 2015-4-19 11:20:34 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-1 15:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表