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中会不会实现闭包现在还没有确定--即便是,那也至少是一年半以后的事了。

相关推荐