Java中的SAMbdas

其中一个主要的问题是Java并没有对函数类型提供
【菜科解读】
最初的Lambda语法饱受诟病,但实际上,问题的严重性远不止纯粹的语法那么简单(毕竟,语法只不过是个外表而已)。
其中一个主要的问题是Java并没有对函数类型提供直接的支持,这给Java类型系统带来了一些问题(函数数组可能引起异常泄漏)。
无论能否克服这些问题(或者说在给定的JDK 7延期发布的时间内),Lambda都不会再涉及函数类型了。
我们可以采用适配的方式简化内部类的编写过程。
这些类叫做SAM(即Single Abstract Method)类。
它代表了Java语言中抽象类与接口的一个重要子集,仅包含一个抽象方法。
比如说,Runnable接口的run()方法、Comparator接口的compare()方法等(只包含一个抽象方法的抽象类也是可以的,比如eclipse的org.eclipse.core.runtime.jobs.Job)。
目前进行中的规范表明下面两种表达方式是等价的:
Collections.sort(list,new Comparator() {public int compare(Object o1, Object o2) {return(o1.toString().length() - o2.toString().length());}}// is the same asCollections.sort(list,{ Object o1, Object o2 -> o1.toString().length() - o2.toString().length() });不得不说的是,Lambda语法依然处于提案阶段,未来可能会发生变化,但基本想法是在Lambda项目的帮助下,我们可以更加简洁的方式编写内部类,从而抛弃现在所用的匿名类方式。
另外,Lambda会保持与内部类一样的表现力,可以从局部堆中获取状态(但堆是否要保持可变的状态依然是人们争论的热门话题)。
然而,语言本身的一些变化(比如说可以高效获取final变量)以及类型与方法/异常推断的能力使得Lambda要比相应的匿名类更加简洁。
之所以采取这种方式,一个原因就是可以不必修改现有的类(主要是 java.util包中的集合类)。
假如使用了函数类型方式,那么就必须得修改集合类以适应Lambda,或者是在JDK 7中放弃对Lambda的支持。
其他程序库可能比较灵活,但整个Java类库并非这么容易修改,这也解释了为什么要采取其他方式。
还可以使用方法引用来代替SAMbda。
如下代码所示:
public class Comparisons {public static int compareLength(Object o1, Object o2) {return(o1.toString().length() - o2.toString().length());}public static int compareHash(Object o1, Object o2) {return(o1.hashCode() - o2.hashCode());}}// examplesCollections.sort(list,#Comparisons.compareLength);Collections.sort(list,#Comparisons.compareHash);#代表方法句柄,类似于java.lang.reflect.Method。
然而,与Method不同的是,他们是在编译期(而非运行期)确定的,JVM的JIT可以自动内联方法引用。
这么做还具有其他优化效果,比如说针对给定的SAM类型,可以单独创建一个类表示代理的方法句柄而不必在使用时创建新的匿名类。
最后,还是存在一些有争议的问题。
目前规范的最初草案禁止使用break和continue,但后来澄清说这么做的目的是为了防止跳出SAMBda而进入到封闭的范围内。
另外一个主要的变化是return变成隐式的了,不允许在Lambda内部使用;但替代的关键字yield(不要与Thread.yield()混为一谈)与内部类中的return具有相同的语义。
表面上来看,这么做可以实现在方法调用后,使用Lambda触发方法中的return的效果(即所谓的 long return )。
未来在语法上也会有一些变化,可以在Lambda中使用return,这需要使用新的关键字(或是关键字组合,比如long return)。
其他相似之处还有使用this引用封闭的SAM实例,使用Outer.this引用封闭类的实例。
虽说使用Lambda替换SAM这个决定不如项目最初的提案那样雄心勃勃,但还是有不少优势的:实现简单、无需修改现有的集合类、能够很快派上用场(不管使用何种方式,只要增加函数类型就需要修改集合类)。
未来,还可以使用相同的Lambda语法创建函数引用,但其目标是今后发布的JDK版本。
Java,中的,SAMbdas,最初,的,Lambda,语法《清明上河图》中的那道城门,是“汴京保卫战”中的哪道门
确实如此,如果在“之耻”前,没有张择端记录下北宋这繁华的一刻,也许我们永远也无法一睹汴京昔日的风采了。
兴盛和衰败,原来就在一瞬之间。
昨天我们说了汴河对于“汴京保卫战”的影响,今天,我们来看看汴京城的城门。
在《清明上河图》中,只出现了一道城门,就是在接近轴底的地方,整幅画的1/6处。
城门左侧,就是城区;城门右侧,就是城外,也就是郊区。
这样看:《清明上河图》大部分都是描写的汴京城外的景色。
在金兵打来以前,我们可以看到:汴京城的城门是比较松懈的,甚至连2个像样的站岗士兵都没有看到。
也许在他们心中,永远也不会想到汴京城有朝一日会成为战火纷飞之地。
看过大型历史战争剧的朋友,心中的城墙估计是这样的: 而《清明上河图》中的城门是这样的: 当我第一次看到这座城门的时候,心里也感觉有很大的落差。
这种门和城墙,怎么经得起砲石的轰打呢? 但通过专家分析,的城墙就是这个样子的,如果你看到的《清明上河图》上的城墙是很现代的,反而证明你看到的画是假的。
看着这样一道门,笔侠心中不由好奇:这到底是汴京城的哪一道门呢?金军是从这道门攻进去的吗? 要解开这个谜团,就得结合汴京城的平面图,和“汴京保卫战”的进程来看。
第一次“汴京保卫战”,完颜宗望没怎么打,围了一段时间城就撤了,所以很难找到蛛丝马迹。
而第二次“汴京保卫战”就详细多了,完颜宗翰(粘罕)和完颜宗望(斡离不)围着汴京城狂攻了1个多月,其中争夺最为激烈的就是城东的善利门、通津门和城南的宣化门,我们结合平面图来看看这几座城门。
大家注意看图:善利门和通津门实际上是两道水门,只有宣化门是一座陆门。
而《清明上河图》里面是一座陆门,那就只有可能是宣化门。
再来看宣化门的位置。
宣化门在城南,而汴河在城东,汴河进城只有2道门,就是通津门和上善水门。
这样看来,上善水门的位置和《清明上河图》里面的那道门更接近。
而且,汴京的粮仓大多集中在通津门和上善水门内,所以,金兵才会疯狂地攻打这2道门。
但问题是:这2道门都不是陆门。
由于实在无法在汴京城找到一个和《清明上河图》描述完全相同的场景,所以,笔侠只有大胆地猜测:张择端有可能把几个不同的片段融合到一起去了。
也就是说:城门是城门、虹桥是虹桥、汴河是汴河,它们可能来自不同的取景,只不过被张择端创作到一幅画里面去了。
实际上,金兵猛扑了通津门好几次,都没有得逞,被北宋“四大将门”之一的姚友仲击退了回去。
后来,他们又猛攻宣化门,姚友仲几乎与城门共存亡。
关键时刻,兵部尚书孙傅竟然相信妖道郭京的“六甲神兵”,将原有守军撤下来,才最终导致城门失守。
随机文章民国哪些人最爱逛北京知名妓院“八大胡同”?探寻爱因斯坦不敢说秘密,到了4岁才学会说话的爱因斯坦通灵外道魔像条件,必须具备轮回眼(仅长门斑带土通灵过)为什么科学的尽头是神学,连爱因斯坦都发现障碍物后面的神学家三星堆不是汉族文明, 三星堆外国科学家解密/三星堆其实是源于古蜀国
鲁班书书中全部都是禁书吗 书中的下半部分下落如何
鲁班是中国木匠行业的祖师爷,是中国古代先民智慧的象征。
鲁班制作发明的东西都非常的巧妙实用,像打仗用的云梯、鲁班尺、锁等等。
鲁班制作的木鸟,惟妙惟肖,只需要借助风的动力,就能在空中飞上三天不降落。
鲁班把毕生所学都凝结成了一本书《鲁班书》,按理说这本书是鲁班智慧的结晶,学会了就会拥有绝妙的手艺。
可在历朝历代却把《鲁班书》列为禁书,只因为大家都说这部书充满了诅咒,学过这部书的人要么孤独终老,要么残疾一生,或者亲人遭殃,反正就是。
这本书分为上下两卷:上卷讲的是木匠手艺之法,多是鲁班智慧结晶;可下卷说的是护身害人之术以及一些医疗法术又称鲁班术。
这个下卷就是我们指的禁书,这部书里面的技巧不是自己能够琢磨出来的,如果学的不当反而会祸及自身。
这个就和武侠小说中练武林秘籍的是一个道理,稍有不慎就会走火入魔。
民间就有“阴阳三代灭,道师三代绝”的说法。
据说鲁班自己也深受这部书的毒害,传说鲁班的妻子非常喜欢鲁班发明的小玩意,有一次鲁班发明了一个木鸢,这个木鸢就像我们上面提到的木鸟一样,只不过比较大号,可以载人飞行。
鲁班的妻子非要上去试试,不过这木鸢不能见血,一碰就失灵了。
鲁班的妻子并不知道这些,她坐上去只是觉得好玩,一不小心,木鸢上的毛刺划破了她的手,鲜血直流。
顿时木鸢失控,掉落下来,鲁班妻子就过世了。
至此之后,鲁班不让后代学这部书,并警告后人,学此书者不得善终。
现在这部书的下半部被统一销毁了,现在基本上是看不到了的。
不过到底学这部书究竟会怎么样?我们现在已经无从考证了,不过古代的时候算命的大多是盲人,不知道是不是学了这部书呢? 随机文章惹毛慈禧下场超惨!他被斩首受尽折磨遭钝刀狂砍30多下冰箱微波炉放一起爆炸,造成2人死亡/其威力相当恐怖(需谨慎)大自然的奇妙声音,奇妙的声音十大用途(回声定位/治疗癌症)拉尼亚凯亚超星系团,半径5.2亿光年/质量是银河系10万倍诺贝尔奖为什么发不完,诺贝尔奖金还剩多少钱(投资理财/钱滚钱)