g*****g 发帖数: 34805 | 1 C#写出啥Java写不出来的东西了?storm都分分钟被改写成jstorm,你这傻逼就是不能
面对现实。 |
|
b***e 发帖数: 1419 | 2 JVM的legacy就在那摆着,连parametricity都搞不定,closure也只能用sugar来搪塞。
Closure显然是一个独立的语义概念,跟语法糖没关系。 |
|
|
k**********g 发帖数: 989 | 4 Java OOP can be used to implement a new layer of "language" on top of it.
This new "language" could be FP. Obviously, in this situation the "language"
can only be executed in interpreted mode, unless you are able to compile it
into JVM bytecode.
http://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule |
|
g****t 发帖数: 31659 | 5 靠,只看能不能写出来,
效率和维护难度不算了?
组合逻辑3,5个符号就是图灵完备的。是不是所有其他计算机语言都是语法糖呢。 |
|
g*****g 发帖数: 34805 | 6 storm被改成jstorm恰恰是为了降低维护难度。效率更高就不用说了。 |
|
|
d*******r 发帖数: 3299 | 8 我记得阿里巴巴有个 java storm,你说的是那个吗?美国这边有人用没?
还是 storm 官方又出了个 jstorm? |
|
n*w 发帖数: 3393 | 9 没有用的。早有多人解释个这个了。某些id无法理解。所以之前看到那些科班非科班,
外行内行被某些id拿来攻击别人时不少人惊呆了。 |
|
g*****g 发帖数: 34805 | 10 傻逼你丫成天死撑有用吗?我老说了多少次,实例实例,是不是语法糖拿个做不了的东
西出来就论证了。需要绕来绕去的吗?C#被秒成这样成天拿个语法糖来做遮羞布。 |
|
n*w 发帖数: 3393 | 11 自己对上号了。还提一下强化一下自己无知。
转进莫名其妙提c#干嘛?c#完蛋了也和这个贴没关系吧。 |
|
g*****g 发帖数: 34805 | 12 是骡子是马拉出来遛,拿不出实例成天做怨妇有蛋用。你丫一文科大妈就别出来丢人了。 |
|
n*w 发帖数: 3393 | 13 你最善于把最合适描叙自己的话拿来攻击别人。
了。 |
|
z****e 发帖数: 54598 | 14 再靠
当初阿里巴巴之所以搞一个jstorm
就是因为storm没有多少人会clojure
导致找不到人来维护
所以搞成了jstorm
从这点上说,fp纯粹就是无法维护
没有人会,维护个p,难道都找phd去维护?
你愿意去做维护的工作吗? |
|
z****e 发帖数: 54598 | 15 是阿里巴巴觉得storm无法维护
因为clojure会的人太少
所以弄成了jstorm
fp的维护从来都是一个大问题
会的人少不说
很多fp的爱好者都是学术派
让学术派去做维护这种大专生做的工作
基本上都在骂娘
所以fp多数都是烂摊子
就看写的那拨人还在不在
如果不在了,多半是屎坑一个
都不愿意接盘,就跟现在node上一堆callback hell一样
只有leiss这样的nice guy才会坚持,如果是我
我多半要跑路 |
|
p*****2 发帖数: 21240 | 16
大牛怎么看Java加入的FP features |
|
z****e 发帖数: 54598 | 17 rxjava里面用起来很方便呀
我对fp也是一知半解,但是lambda加入很多人有意见
但是我觉得rxjava推广之后,应该反对声音会少不少
本来lambda用来替代以前用的匿名类还是不错的
匿名类太恶心了,写过app的都很讨厌匿名类hoho |
|
p*****2 发帖数: 21240 | 18 用了scala以后很难再回到java了
java8也不行
其实你的背景很适合用scala |
|
z****e 发帖数: 54598 | 19 最近说fp跟异步有关
因为异步可以带来一定程度上运行效率的提升
所以后来都在讨论怎么借鉴这个feature
所以才有了java8的lambda
以及搭配lambda使用的reactive,具体到java就是rxjava
剩下的也看不出啥价值了,除了scala的数学符号可以自己定义以外 |
|
z****e 发帖数: 54598 | 20 那要看多顺着人思维了
小学二年级我们就学会了列方程解应用题
列方程显然更靠近人的思维,变量当然应该保留
我超喜欢列方程的,哪怕最简单的1+x=2我都会列出来
因为简单
虽然我也承认oop有些地方不足
但是你说要把oop整个枪毙掉,从头来过
那这也有些问题吧?正常人应该都能看出这种做法有些问题
所以我觉得rxjava才是发展方向,至于什么immutable
水至清则无鱼,scala又太混乱,什么都来,也不行
rxjava作为扩展,跟java8搭配得很好呀
vert.x什么马上就能顶上,哦也
用了再说,没用过,没实践过,都是只说好的,不说坏的
说node的时候,有人注意到30层的callback hell吗?
现在说fp其实也是一样,层层嵌套是个大问题
我用rxjava的经验看,效果良好,既没有丢掉以前的经验
又做了效率提升以及适当的思维训练,大家都happy啊 |
|
T******7 发帖数: 1419 | 21 ruby, rails, scala, play, haskell, fp, cassandra, mongodb, node, js, coffee
, rust, cpp14/17, java8, R, julia, clojure. peking2, zhaoce, lambda, swift,
web, html5.
不全请补充。
补充:dart, vert.x |
|
z****e 发帖数: 54598 | 22 fp你很快就会了
因为java8已经加进去
rxjava又加了一部分进去
离真正的fp已经不远了
现在就剩下immutable这种争议非常大的部分
不会其实也没啥大不了的
monad等adt属于很扯蛋的东西
把一些不相干的东西死活扯到一起去
美其名曰type system,笑死
你看coltzhao的那个exception例子就知道了
看上去很fancy,其实很搞笑 |
|
z****e 发帖数: 54598 | 23 container.deployVerticle("foo.ChildVerticle", new AsyncResultHandler
() {
public void handle(AsyncResult asyncResult) {
if (asyncResult.succeeded()) {
System.out.println("The verticle has been deployed, deployment
ID is " + asyncResult.result());
} else {
asyncResult.cause().printStackTrace();
}
}
});
你说的是这种吧?
这个其实不是,verticle的名字放在第一个参数里面,也就是那个foo.ChildVerticle
这个才是verticle,后面那个handler是异步时候需要做的,其实就是一个lambda
文档为了向后兼容,所以用老的方式写,... 阅读全帖 |
|
z****e 发帖数: 54598 | 24 会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖 |
|
z****e 发帖数: 54598 | 25 会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖 |
|
z****e 发帖数: 54598 | 26 flatMap
concaMap
filter
reduce
还包括map,不是collection那个map
这些在rxjava里面都有了
感觉就是scala前面做,java跟着后面抄
java8弄了lambda(without currying)
vert.x弄了async(without immutable&mul-process)
rxjava弄了monad(collection part, without side effect)
这种选择性吸收深得我心啊,取其精华,弃其糟粕
下一个弄啥?streaming吗? |
|
z****e 发帖数: 54598 | 27 +观感正面,-观感负面
lambda +,写程序更简洁些
currying -,混乱,map到底是func还是obj?
1st-class func -,混乱,理由同上,同时需要跟immutable配合
immutable -,同上
monad +,collection部分不错,但是如果是包装其他的则观感负面
functor +,不错,理由同上
dynamic type +,有限滴使用,搬运数据时候用,否则混乱
async +,可以提升性能
single thread -,这哥们是来搞笑的
scala以上全部都可以做,也都可以不做
clojure到dynamic type以上都必需做到,谁让它纯呢?
java基本上就只允许做观感正面部分,除了dynamic type
which可以交给groovy完成,负面部分不是特别麻烦就是会被禁
java8加了lambda
vert.x有async
rxjava有functor和monad |
|
|
z****e 发帖数: 54598 | 29 俺不负责滴预测一次
只要l家有组用了vert.x
就会蜂拥而至,vert.x和java8不冲突
还有rxjava,netflix已经在用了 |
|
|
z****e 发帖数: 54598 | 31 俺不负责滴预测一次
只要l家有组用了vert.x
就会蜂拥而至,vert.x和java8不冲突
还有rxjava,netflix已经在用了 |
|
p*****2 发帖数: 21240 | 32
不对。应该是这样的
Option
.flatMap
.filter
.map
当然我指的是functional programming。这样你就不会抛出异常了。如果你想保留
exception信息的话可以用Try,但是java8还不支持,Scala就可以。这种pattern跟
Java的try/catch不一样,是Functional的。使得你可以完全关注与业务逻辑和代码,
而不需要care exception。 |
|
a********5 发帖数: 1631 | 33 以后也不会再用了
MOBILE SERVER是唯一一个用NODE的SERVER 本来还算壮大 因为不同TEAM的人都要往上
面加东西
今年开始MOBILE从后到前彻底推倒重来,NODE以后也不会再使用了
未来一年在新的SERVER和APP彻底能WORK之前 还会连接到NODE,但是只做维护,不加
FEATURE。。
我应该是最后一个在NODE SERVER上站岗的人。。
我还是很喜欢NODE的,简单粗暴直接,快。新的那套PLAY + RESTLI + PARSEQ + JAVA8
,呵呵,前几天搞了个半天的培训,结果压根就没几个人在那一下午把东西跑起来的。
WHATEVER。UBER去年面挂了,哪个大牛如果还需要NODE程序员的话求待我抱一下大腿。。
以后L会变成一整个JAVA FACTORY。大概是方便烙印搬运吧。 |
|
p*****2 发帖数: 21240 | 34 唉。 看来以后l就不用考虑了。
l把这些新技术淘汰的主要原因是什么呀?
一般来说都是政治。
貌似a也用node
JAVA8
。。 |
|
z****e 发帖数: 54598 | 35 用了node又被推翻那这个显然不是什么方便阿三搬运那么简单
否则一开始就不会上node
简单粗暴不是错,错在server不可能永远简单粗暴下去
该解决的问题迟早要解决
play真难用,vert.x容易得多
vert.x既没有play那么复杂,又有node的简单粗暴
人总是在吃到各种亏之后才会记住教训
JAVA8
。。 |
|
z****e 发帖数: 54598 | 36 用scala那几个id的平均水平最高
不管是骂还是捧,只要是认真写过scala的,水平都在
那种写过hello world就自诩用过scala的不算
明显胜过其他那些,也就是scala那几个能解释清楚为什么要这么做
这些概念啥意思,也明白java到底是怎么回事
能够比较自如滴交流,其他的,很多不懂怎么回事,容易鸡同鸭讲
我说的是平均水平,用scala那几个出来说,我写过java
我信,但是如果是其他的,那未必是真的,多数是吹牛
scala好就好在,对于各种features可以自由选择
而不用换个feature就换个语言,这种做纯粹脑子进水
因为语法要背半天,看来以后要专注于扯蛋scala了
对于学习scala,我的心得是最好先把java学清楚,不要跳过java
否则你会死得很惨的,举个例子,比如case class
这里面一堆东西,比如case class有get方法
如果你工作中用过java,应该知道怎么用
其次case class是singleton,你用过spring的话,这个就不会陌生了
还有自动实现了equals&hashcode,这两个也常用
但是这两个是初学者经常出问题的... 阅读全帖 |
|
z****e 发帖数: 54598 | 37 fp太形而上了,需要时间消化和吸收,hoho
一般我也不怎么用fp,java8&rxjava这些不算的话 |
|
c******f 发帖数: 243 | 38 在学java 8,用Java做不出来...哪里错了
同样的题 majority number..
scala
val num = List(1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,2,3,4,5,6,7)
num.groupBy(x=>x).filter(_._2.size > num.length / 2).map(_._1).foreach(
println)
output:
1
java
List nums = new ArrayList<>();
for (int i = 1; i <= 15; i++) nums.add(1);
for (int i = 1; i <= 3; i++) nums.add(i);
Collection> collect = nums.stream().collect(Collectors
.groupingBy(n -> n)).values();
System.out.println(... 阅读全帖 |
|
|
z****e 发帖数: 54598 | 40 用rxjava就好了
filter, map这些都有 |
|
z****e 发帖数: 54598 | 41 这个贴很好滴说明了debug fp有多苦逼了
小手都搞不定啊 |
|
|
z****e 发帖数: 54598 | 43 没有回答到点子上啊
反正debug就是debug到这么一大坨出了问题
Stream.of(collect).filter(l -> l.size() > nums.size() / 2).collect(
Collectors.toList()).forEach(l -> System.out.println(l));
这里面n步,用fp的写法,ide都帮不了你啊
debug颇为耗时的说
上面scala的写法也是一样的
只不过没出问题,等出了问题的时候
这么一大坨还不如重构 |
|
z****e 发帖数: 54598 | 44 Stream.of(collect)
.filter(l -> l.size() > nums.size() / 2)
.collect(Collectors.toList())
.forEach(l -> System.out.println(l));
写成这样,然后设置断点,用ide一个个看过去
看哪一步出了问题 |
|
c******f 发帖数: 243 | 45 这也太怪了吧...
Stream.of(collect).forEach(l-> System.out.println(l + " " + nums.size()));
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2], [3]] 18
我还以为是
[1,1,....1] 18
[2]
[3]
原来这样才对,要看API才行, 还是不太喜欢java 8
Collection> collect = nums.stream().collect(Collectors
.groupingBy(n -> n)).values();
collect.parallelStream().filter(l->l.size() > nums.size() / 2).
collect(Collectors.toList()).forEach(l -> System.out.println(l)); |
|
z****e 发帖数: 54598 | 46 api另说
你用的debug方式太原始了
是println
工作中这样搞搞到什么时候去
建议用ide啊
直接看内存变量的val,而不是println出来
Collectors |
|
c******f 发帖数: 243 | 47 java 8 ide debug不了啊,filter()之后collect变量的还是一样的.... |
|
|
z****e 发帖数: 54598 | 49 会产生一个local variable
用上inspect功能应该可以看到
选中,然后右键点击打开列表,看看有没有inspect
然后试试看 |
|
|