仓酷云

标题: JAVA教程之从Groovy到Java 8仓酷云 [打印本页]

作者: 灵魂腐蚀    时间: 2015-1-18 11:23
标题: JAVA教程之从Groovy到Java 8仓酷云
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看net网页编程Beans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。Groovy开辟职员早已熟知Java8中新引进的观点和新的言语布局了。在Java新版本行将推出的加强特征中,有良多是Groovy在几年前就已供应了的。从用于函数式编程作风的新语法,到lambdas表达式、collectionstreaming和要把办法援用作为一等国民,Groovy开辟职员在将来编写Java代码时具有后天性上风。本文将重点存眷Groovy和Java8的配合点,并论述了Java8怎样解读Groovy中那些熟习的观点。
我们先来会商一下函数式编程作风,今朝在Groovy中怎样利用函数式编程,Java8的观点怎样供应更好的函数式编程作风。
闭包(Closures)大概是Groovy中最好的函数式编程实例了。从外部布局来看,Groovy中的closure只是一个函数式接话柄现。函数式接口是指恣意只必要完成一个办法的接口。默许情形下,Groovy的closure完成了一个名为“Callable”的函数式接口,完成了这个接口的“call”办法。
  1. defclosure={"called"}assertclosureinstanceofjava.util.concurrent.Callableassertclosure()=="called"
复制代码
经由过程转换closure的范例,我们可让Groovy完成其他函数式接口。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"
复制代码
在Java8中很好地引进了闭包和函数式编程的头脑。在Java行将公布的版本中函数式接口极其主要,由于在Java8中针对新引进的Lambda函数式接口供应了隐含的完成。
我们能够把Lambda函数当做Groovy中的闭包那样往了解和利用。在Java8中完成callable接口像Groovy中的闭包一样复杂。
  1. Callablecallable=()->"called";assertcallable.call()=="called";
复制代码
你必要出格注重是,Java8为单行的lambda函数供应了隐含的前往语句,厥后Groovy也自创了这个观点。未来,Groovy也会为单个笼统办法供应隐含完成(相似于Java8供应的那些完成)。这个特征使你不用完整派生出closures的详细子类对象就能够利用实例的属性和办法。
  1. abstractclassWebFlowScope{privatestaticfinalMapscopeMap=[:]abstractdefgetAttribute(defname);publicdefput(key,val){scopeMap[key]=valgetAttribute(key)}protectedMapgetScope(){scopeMap}}WebFlowScopeclosure={name->"edited_${scope[name]}"}assertclosureinstanceofWebFlowScopeassertclosure.put("attribute","val")=="edited_val"
复制代码
Java8针对带有接口默许办法的函数式接口提出了一个相似的观点,即Java的新观点“接口默许办法”。他们但愿借此观点在不违背接话柄现规约(在Java之前的版本中创建的完成规约)的条件下改善中心的API。
当把Lambda函数强迫转型为接口时,它们也能够利用接口的默许办法。也就是说在接口中能够内置强健的API,使开辟职员不用改动范例的品种或规约就能够利用这些API。
  1. publicinterfaceWebFlowScope{staticfinalMapscopeMap=newHashMap();ObjectgetAttribute(Objectkey);defaultpublicObjectput(Objectkey,Objectval){scopeMap.put(key,val);returngetAttribute(key);}defaultMapgetScope(){returnscopeMap;}}staticfinalWebFlowScopescope=(Objectkey)->"edited_"+scope.getScope().get(key);assertscope.put("attribute","val")=="val";
复制代码
Java8中的接口默许办法还能够帮我们完成像memoization和trampolining如许的Groovy特征。你能够很复杂就完成memoization特征,只必要创立一个带有接口默许办法的函数式接口,并完成这个默许办法让它从缓存中断定预算了局或前往了局就能够了。
  1. publicinterfaceMemoizedFunction<T,R>{staticfinalMapcache=newHashMap();Rcalc(Tt);publicdefaultRapply(Tt){if(!cache.containsKey(t)){cache.put(t,calc(t));}return(R)cache.get(t);}}staticfinalMemoizedFunction<Integer,Integer>fib=(Integern)->{if(n==0||n==1)returnn;returnfib.apply(n-1)+fib.apply(n-2);};assertfib.apply(20)==6765;
复制代码
一样,我们还可使用Java8的接口默许办法开辟Trampoline的完成。Trampoline是Groovy的一种递回战略,这个特征十分合用于深度递回,而不成能代替Java的挪用栈。
  1. interfaceTrampolineFunction<T,R>{Rapply(T...obj);publicdefaultObjecttrampoline(T...objs){Objectresult=apply(objs);if(!(resultinstanceofTrampolineFunction)){returnresult;}else{returnthis;}}}//WrapthecallinaTrampolineFunctionsothatwecanavoidStackOverflowErrorstaticTrampolineFunction<Integer,Object>fibTrampoline=(Integer...objs)->{Integern=objs[0];Integera=objs.length>=2?objs[1]:0;Integerb=objs.length>=3?objs[2]:1;if(n==0)returna;elsereturnfibTrampoline.trampoline(n-1,b,a+b);};
复制代码
除closures的基础特征和那些Memoization和Trampolining的初级特征,Groovy还为CollectionsAPI供应了一些有伟大有用代价的言语扩大。我们在利用Groovy时能够充实使用这些扩大点,好比用list的“each”办法十分简便地完成写操纵。
  1. deflist=[1,2,3,4]list.each{item->printlnitem}
复制代码
Java8针对汇合的迭代引进了一种与Groovy相似的观点,供应了一个与“each”类似的“forEach”办法,能够用它代替list传统的迭代体例。
  1. List<Integer>list=newArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.forEach((Integeritem)->System.out.println(item););
复制代码
除简化list的迭代,Groovy还为使用开辟职员供应了各类快速写法以简化各种list操纵。好比“collect”办法,你用这个办法能够将list元素疾速映照为新的范例(或新的值),然后把了局放进新的list里。
  1. deflist=[1,2,3,4]defnewList=list.collect{n->n*5}assertnewList==[5,10,15,20]
复制代码
在Groovy中“collect”的完成对照复杂,你只必要把映照看成一个参数传送给“collect”办法。可是,Java8的完成就略微有点庞大了,开辟职员可使用Java8的StreamAPI完成一样的映照和搜集战略,完成时要挪用“list”的“stream”组件的“map”办法,然后再挪用“map”办法前往的“stream”的“collect”办法。开辟职员能够如许一连利用StreamAPI完成list连续串的操纵。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"0
复制代码
Groovy还能闪开发职员利用“findAll”办法简便地选择list。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"1
复制代码
一样地,Java8开辟职员可使用StreamAPI选择list。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"2
复制代码
GroovyCollectionsAPI扩大还供应了一个“sort”办法,你利用这个办法能够复杂地完成对list的排序。“sort”办法还能够承受闭包参数,你能够在闭包中完成所需的特定排序逻辑,闭包会被转为对照器后完成对list的排序。别的,假如只必要对list举行复杂地逆序排序,能够挪用“reverse”办法反转list的按次。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"3
复制代码
再来看Java8的StreamAPI,我们可使用“sorted”办法对list排序,然后用“toList”办法搜集排序了局。“sorted”办法也撑持自界说的对照器,它有一个可选的函数式参数(好比Lambda函数),你能够将自界说的对照器作为参数传给办法,就能够很简单地完成特定的排序逻辑和反转list条目标操纵了。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"4
复制代码
假如你试图在一个闭包或Lambda函数内完成一切的处置而一连挪用API(好比liststreaming),那末很快就会使代码难以保护。换一个角度来看,假如你要托付响应事情单位特定的办法完成特定的处置,那末这类用法就是一个不错的选择了。
我们利用Groovy时,把办法援用传给函数也能够完成下面所说的方针。你只需利用“.&”操纵符往援用办法,就能够把该办法强迫转型为闭包传给另外一个办法了。因为能够从内部源码引进历程代码,就从实质上进步了完成的天真性。如许,开辟职员就能够在逻辑上构造处置办法,完成更容易保护、可延续演进的使用架构了。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"5
复制代码
Java8也为开辟职员供应了一样的天真性,使开辟职员可使用“::”操纵符取得办法的援用。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"6
复制代码
你能够把办法援用传给恣意以函数式接口为形参的办法。那末,这个办法就会被转型为函数式接口,作为函数式接口实行。
  1. publicinterfaceFunction{defapply();}defclosure={"applied"}asFunctionassertclosureinstanceofFunctionassertclosure.apply()=="applied"7
复制代码
在Java8里,假如类库开辟职员修正了接口规约,那末这些接口的利用者不用为了这些变动往修正那些利用了这个类库的接口。

专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
作者: 若天明    时间: 2015-1-20 23:47
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 深爱那片海    时间: 2015-1-21 17:26
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 愤怒的大鸟    时间: 2015-1-30 21:31
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 再见西城    时间: 2015-2-6 16:02
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 山那边是海    时间: 2015-2-10 20:19
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 透明    时间: 2015-3-1 13:48
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 仓酷云    时间: 2015-3-3 19:01
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 灵魂腐蚀    时间: 2015-3-4 05:02
是一种使用者不需花费很多时间学习的语言
作者: 再现理想    时间: 2015-3-11 05:04
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 小魔女    时间: 2015-3-11 17:17
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 不帅    时间: 2015-3-13 02:08
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 第二个灵魂    时间: 2015-3-20 09:51
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 若相依    时间: 2015-4-14 09:53
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2