Java与Scala中的闭包
原文地址:ClosuresinJavaandScala
翻 译:Eastsun
Peoplearguethatverbosecodeiseasiertounderstand.Doyouagreewhenreadingthesetwoexamples,onemethodinJava,oneinScala?
人们普遍认为,详细的代码更易于理解。但如果你阅读下面两段代码--一个使用Java另一个使用Scala--你是否还这样认为呢?
public List<Item> bought(User user) { List<Item> result = new ArrayList(); for (Item item : currentItems) { if (user.bought(item)) { result.add(item); } } return result; }
def bought(user: User) = items.filter(user bought _)
IfyouarefamiliarwithJava,whichismorelikelythenyoubeingfamiliarwithScala,youmaytendtotheJava-version.Scalahasadifferentsyntaxfordeclaringtypesandgenerics,andsupportsclosures,includinganonymousparameters(theunderscore).
如果你熟悉Java,那么很可能你将会了解到Scala。也许你会倾向于使用Java的版本。Scala具有不同的类型声明以及泛型语法,并且支持闭包,以及匿名参数(下划线)。
WhenClosuresareintroducedinoneofthenextJavareleases,JDK7or8,theexamplecouldberewrittenlikethis:
在Java的后续版本中引入闭包后(JDK7或JDK8),上面Java版的代码可以重写为:
public List<Item> bought(User user) { return ListUtils.filter(Item item : items ) { user.bought(item); } }
Orwithextensionmethods:
或者使用方法扩展:
public List<Item> bought(User user) { return items.filter(Item item : ) { // <-- note the smily! thats what its all about! user.bought(item); } }
TheinterestingdifferencesbetweenJavawithclosuresandScalaisthestatictyping:ScalainferencesthatitemsarealloftypeItem,sothereisnoneedtospecifythatinformationagain.
带有闭包的Java与Scala一个让人感兴趣的区别是它们的静态类型:Scala的类型推断能力能得到其所有变量的类型,因此不需要再指明这一点。
So,whilethecurrentJavaClosuresspecificationisagreatstepintherightdirection,leadbyNeilGafter,whoisquitetherightmanforthejob,itmaynotbeworthtowaitforit,ifyouhavethechoice.Itsnotevensureyetthatwe'llseethatspecimplementedinJDK7,andeventhatisatbestoneandahalfyearaway.
因此,即便目前的JAVA闭包规范在NeilGafter的领导下正朝着正确的方向做出了很大的进步;但我们也未必需要去等待它,如果我们已经有了其他选择。何况JDK7中会不会实现闭包现在还没有确定--即便是,那也至少是一年半以后的事了。