这篇文章讥笑Java是一个名词王国,其实C#也是,“名词”是因为来自于领域建模,现实世界中有很多结构性名词,也就是实体,反映到软件世界的名词,DDD本身也是一种名词建模方法,结合SOA服务,名动词可以完美结合,当然函数式语言可以认为是将SOA服务动词织入语言层次的一种做法。
文中提到因为名词语言的局限,便不容易有Map/Reduce这样伟大云计算产生,这其实也有失偏颇,首先Map/Reduce分两层含义,一种是抽象层面的方法学:分与合;还有一种层面是实现执行层面,也就是算法,很多注重算法的人包括那个李开(始)复(制)一开始介绍google的Map/Reduce也是加上算法两个字,这其实盲人摸象,一管之见而已,
我们看看Map/Reduce其实在每天Java中经常碰到(抽象层面): 我们经常做下面的事情: 1.创建一个输出集合list, 2.从输入集合中遍历每个元素,再调用相应转换方法,然后把转换结果保存到另外一个输出集合中。 3.返回这个输出集合list.
这三步模式其实一种Map操作模式,使用Google Guava 的 Iterables 类提供Map操作如下:
List<Double> exVat = Arrays.asList(new Double[] { 99., 127., 35. }); Iterable<Double> incVat = Iterables.transform(exVat, new Function<Double, Double>() { public Double apply(Double exVat) { return exVat * (1.196); } }); System.out.println(incVat); //print [118.404, 151.892, 41.86] |
Reduce/Fold模式也是经常碰到: Fold是这样一个方法someMethod(T),方法内部有一个的可变状态。 反复调用输入集合中每一个元素,直至到最后,我们得到fold操作的结果。
public double totalAmount(List<Double> amounts){ double sum = 0; for(double amount : amounts){ sum += amount; } return sum; } |