论坛首页 Java企业应用论坛

几行代码解决淘宝面试题 之Clojure版

浏览 26224 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-07-15   最后修改:2010-07-15
写了那么长,我们这也是map/reduce

var collection = Enumerable.Range(0, 1000000).ToArray<int>();
long total = 0;
Parallel.For<long>(0, collection.Length, () => 0, (j, loop, subtotal) =>
             {
                 subtotal += collection[j];
                 return subtotal;
             },
             (x) => Interlocked.Add(ref total,x)
             );


最简单的是:当然C#可以把所有魔术变成一行:

   collection.AsParallel<int>().Sum();

比起楼主那些天书一样的语法,PLINQ简明到任何人一看就懂:

    集合.并行处理.累加

上次还有人说,要处理大于10的,好吧,还是一行处理:
  
  collection.AsParallel<int>().Where(i=>i>10).Sum();

  集合.并行处理.取大于10的.累加。

至于什么partition之类的,本来就不需要程序员去介入,线程数应该等于CPU的core数目,手工去分partition,完全是浪费时间。
0 请登录后投票
   发表时间:2010-07-15  
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
0 请登录后投票
   发表时间:2010-07-15  
hardPass 写道
我觉得关键是要掌握原理,

我相信,用java也可以做出类似的函数,然后一行代码调用即可

蛋疼


我期待你写出来看看。
0 请登录后投票
   发表时间:2010-07-15   最后修改:2010-07-15
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。


当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft用同一套语法能做出:

linq for parellel, linq for grid,LINQ-to-streaming computation , LINQ-to-GPU,

而程序员专注去处理自己的业务逻辑和并行算法。


对于大多数程序员来说,他们只是偶尔需要并行一下,比如正好处理一大段数据等等,这种简单的语法可以对付80%的场景,至于其他20%,.NET有自己专门的并行语言: AXUM,它的语法也远比clojure简单,而且组件可以和C#,F#交互。
0 请登录后投票
   发表时间:2010-07-15  
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。

哥们听说你在淘宝分布式存储招人,假如我被你忽悠学了clojure,你会给我留个位置吗 
0 请登录后投票
   发表时间:2010-07-15  
ray_linn 写道
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。


当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。


您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。
0 请登录后投票
   发表时间:2010-07-15  
kakaluyi 写道
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。

哥们听说你在淘宝分布式存储招人,假如我被你忽悠学了clojure,你会给我留个位置吗 


哥,来我们部门不需要学clojure,您有兴趣就给我简历,多谢。
0 请登录后投票
   发表时间:2010-07-15  
dennis_zane 写道
ray_linn 写道
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。


当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。


您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。



俺个人看法就是,不需要去关注边缘语言,如果C#能做出来的,Java同样也可以如此如此,而且在oralce的领导下,应该会进化得更快...
0 请登录后投票
   发表时间:2010-07-15  
ray_linn 写道
dennis_zane 写道
ray_linn 写道
dennis_zane 写道
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。


当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。


您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。



俺个人看法就是,不需要去关注边缘语言,如果C#能做出来的,Java同样也可以如此如此,而且在oralce的领导下,应该会进化得更快...



clojure的语法是非常精简的,如果你去尝试了解下的话,它本身的实现也才几千行代码。我不大相信oracle能做出大的改变,c#有Anders Hejlsberg掌控,James Gosling刚从oracle离职没多久,从java7的闭包语法来看,基本是个悲剧。
0 请登录后投票
   发表时间:2010-07-15  
dennis_zane 写道


clojure的语法是非常精简的,如果你去尝试了解下的话,它本身的实现也才几千行代码。我不大相信oracle能做出大的改变,c#有Anders Hejlsberg掌控,James Gosling刚从oracle离职没多久,从java7的闭包语法来看,基本是个悲剧。


Java的开发人员太老朽了一点,思路没有.NET团队宽阔。.NET从设计之出就有多种语言互相调用的考量:

主流OO: C# (VB.NET姑且写着 )
函数式: F#
分布式: Axum
多范式(DSL): Nemerle

Java的Scala, groovy都有点遮遮掩掩的。。。不爽不爽
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics