Java中的SAMbdas

作者:小菜 更新时间:2025-03-25 点击数:
简介:最初的Lambda语法饱受诟病,但实际上,问题的严重性远不止纯粹的语法那么简单(毕竟,语法只不过是个外表而已)。

其中一个主要的问题是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,语法

阿德里安堡之战中的哥特式胜利 暴露了罗马在战场上的军队弱点

阿德里安堡之战中的哥特式胜利暴露了罗马在战场上的军事弱点。

由于他们成功地使用对抗罗马步兵,哥特人获得了胜利。

这次哥特式的胜利为进一步的德国攻击打开了大门,开始了多米诺骨牌效应,结束了西欧的罗马帝国统治。

在公元378年8月,战斗发生在叛逆的哥特人和一支被召集起来镇压哥特式叛乱的罗马军队之间。

实际的战斗发生在距离伊斯坦布尔以西的希腊,保加利亚和土耳其边境附近的现代埃迪尔内阿德里安堡约13公里处。

冲突涉及东罗马帝国的野战军队,由弗拉维乌斯·瓦伦斯指挥,反对一支混合的哥特式军队,其核心由弗里格格恩下的Tervingi部落组成,由阿拉图斯和萨普拉克斯以及其他哥特部落领导的格雷图吉尼支持。

哥特人在公元376年与罗马人签订了一项条约,允许他们在帝国内定居,但由于他们从罗马人那里得到的虐待,哥特们反叛了。

瓦伦斯打算结束这种哥特式的威胁,但他过早地根据关于哥特式下等数字的伪造情报报告进行了攻击,而没有等待格拉蒂安皇帝下的西罗马军队抵达。

在战斗中,罗马军队彻底失败了。

三分之二的罗马军队,大约15,000名士兵被杀,包括瓦伦斯。

哥特骑兵 阿德里安堡的哥特式部队配备了重型骑兵。

哥特式骑兵骑在强壮的马匹上,可以承载骑手的重量和身体盔甲。

哥特马穿着防弹衣,以保护动物免受各种武器的伤害。

由于他们的装甲马不易受到严重伤害,哥特骑兵更愿意与敌人靠近并使用他们选择的武器,具有毁灭性冲击和致命效果的冲刺矛。

哥特式骑兵战术在阿德里安堡之战中起了决定性作用。

战场分析与战术 在夏季的中午炎热时期,两支罗马军队的先进分朝着哥特人的方向前进。

瓦伦斯愚蠢地决定在格拉蒂安到达战场之前开始一场决定性的战斗,因为他正在寻求所有的荣耀和错误的侦察,说服他只有一半的哥特力量存在。

阿德里安堡之战在几个阶段发展起来。

首先,罗马人向哥特式营地前进。

随着罗马军队的接近,哥特人采取了防御阵型,将他们的马车圈成了一个保护他们的妇女和儿童的拉杆。

他们用步兵保护他们的临时防御。

其次,罗马军队正在遭受酷暑,口渴和饥饿,而在没有哥特式骑兵的情况下,正在谈判休战,当时罗马骑兵部队的无序攻击引发了一般的军事行动。

第三,在罗马骑兵袭击失败后,哥特式骑兵突然从觅食的远征中返回并猛烈冲向罗马右翼,导致许多罗马士兵死亡。

随着更多返回的哥特骑兵到来,他们积极攻击罗马人暴露的左翼。

罗马人的队伍被两侧的哥特式骑兵攻击击碎,直到完全爆发。

最后,在罗马骑兵在混乱中被赶出战场后,哥特骑兵继续攻击罗马步兵的侧翼,迅速围绕并消灭罗马中心。

大约三分之二的罗马军队在炎热的夏季战场上死亡,其中包括Valens,其身体从未被发现。

战场影响与意义 虽然由于罗马的失败,阿德里安堡之战很重要,但冲突的真正影响在于战争的未来。

从西方战争开始直到在阿德里安堡的交战中,带有棍棒,剑和长矛的步兵在欧洲战斗中占据了战场。

骑兵部队偶尔会进行罢工,扫射侧翼,并进行侦察行动,但只有少数骑在马背上的战士直接对抗敌军。

这场战场战术随着阿德里安堡的哥特式胜利而改变。

哥特式骑兵成为中世纪骑士和许多骑兵部队的前身,这些部队将在未来1000年内统治欧洲战场。

只有当英国长弓弓箭手在克雷西(公元1346年)和阿金库尔(公元1415年)击败法国骑兵时,阿德里安堡的骑兵战术才开始从许多欧洲战场上消失。

到了20世纪,马骑兵已经被地面和空中的装甲机械化骑兵所取代,类似的机动和战术再次复活。

随机文章夏朝的货币是什么?中国400吨重型运输机简介,发动机比运20大2倍蚊式战斗机用的什么木材,专用巴尔沙木制造(速度碾压德军战机)直立浮尸科学怎么解释,尸体腐烂产生的气体膨胀而漂浮神仙千里眼顺风耳来历,历史著名人物被后人崇拜演化成神仙

三十六计中的第三计,郑桓公用过,皇太极也用过

借刀杀人是中的第三计,同时也是第一套胜战计的第四计,书中原文是这样的“敌已明,友未定,引友杀敌,不自出力,以《损》推演”。

译文是这样的“敌人的情况已经明确,而盟友的态度还未明朗,利用盟友的力量去消灭敌人,就不必自己付出什么力量了,这是从《损》卦中推演出来的计策”。

这一计策的名字源于《韩非子.内储说下》,当时郑桓公想要侵占郐国,但是郐国有不少的能臣勇将不好打。

他的谋士就为他出了一个计策,让手下人去讲郐国的英雄豪杰、能臣勇将的名字都记下来。

自己挑选了一个吉利的日子在城门边设了一个祭坛,一下子引来了很多人公布自己要攻打郐国的消息,并放出消息说郐国的能臣勇将不喜欢自己的国君,想要邀请自己做他们的国君,他假装宣誓当自己攻下郐国之后就将郐国的良田赠送给他们,并让他们做大官,然后将写有能臣勇将名字的帛书埋在了祭坛下面。

后来帛书到了郐国国君的手中,郐国国君一怒之下将这些人全都杀了,最后郐国被郑桓公不飞就灭了。

在历史中有一个经典的借刀杀人的事件,这就是皇太极计除袁崇焕,当时努尔哈赤率军攻打宁远,结果被袁崇焕挫伤满军锐气而败北,努尔哈赤也因为这件事羞愧愤懑,气急身亡。

他的儿子皇太极经过几年的准备再一次进攻。

这次他避开了宁远想要直插后方,但是袁崇焕及时赶到满军又一次败北。

为了除掉袁崇焕,又因为皇帝多疑,所以皇太极想到了一个借刀杀人的妙计。

他派人用重金贿赂明朝宦官。

让宦官“告密”。

宦官“告密”说袁崇焕因为与满军签订协议,所以满军才成功翻阅长城进入内地。

最终一代名将袁崇焕因为皇帝的不信任最终被斩首。

随机文章鲨鱼为什么怕海豚,鲨鱼为什么不吃海豚(海豚完胜鲨鱼/屌炸天)南极为什么没有北极熊,与南极洲的形成和北极熊祖先有关巴拿马运河谁修的,巴拿马运河是美国的吗(美国建造/不属于美国)诺贝尔奖为什么发不完,诺贝尔奖金还剩多少钱(投资理财/钱滚钱)一生比较倒霉的生肖,生肖牛/猪/兔败在性格上(只能求贵人相助)

加入收藏
               

Java中的SAMbdas

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录