ES6中导入了斜线表达式,这也是那时后端复试基本上必修的文本(董灿斜线表达式,我都不耐烦说他们是辩手,呵呵,开个笑话)。没人问我,斜线表达式是个甚么小东西?我跟他说,就像Java和C#中的lambda。
1.举个单纯的红豆:
1.1 JavaScript
let func =(s)=>{ console.log(s);};func(“hello world”);
1.2 Java
interface Operate {void doSomething(String str);// void doSomething1();不能有三个方式}public static void main(String[] args){Operate func =(String s)->{ System.out.println(s);};func.doSomething(“hello world”);}
1.3 C#
var func =(string s)=>{ Console.WriteLine(s);};func(“hello world”);
1.4预测
能看见,读法十分类似于,特别是Js和C#。表达式func能被当作三个表达式来采用。
所以用作承揽那个非官方方式的表达式是甚么?
JavaScript:是三个js中的function
Java:在范例中,有点儿难蒙蔽,没错是将lambda表达式给了三个USB类型。但最后初始化的这时候又要初始化该USB的doSomething方式。所以那个USB根本无法有三个相关联的方式,多了会收起。
Java10中也提供了var关键字,但遗憾的是也不能被用作这样lambda表达式的情况。
C#:实际上是三个委托类型,例如:
delegate void doSomething(string str);public static void Main(string[] args){doSomething func =(string s)=>{ Console.WriteLine(s);};func(“hello world”);}
这样看和Java有点儿像了,但定义的仍然是三个方式,而不是三个USB中有三个同样类型的方式。
如果在c语言中我们会用三个指向表达式的指针。
2.对表达式外表达式的引用
在上一节的范例中,“hello world”是以参数的形式传递到方式中的,所以,是否能直接引用外部的方式呢?
当然是能的,改造一下上面的范例:
2.1 JavaScript
let str =”,圣诞快乐。”;let func =(s)=>{console.log(s + str);str =”,春节快乐。”};str =”,元旦快乐。”func(“hello world”);func(“hello world”);
2.2 Java
interface Operate {void doSomething(String str);// void doSomething1();不能有三个方式}public static void main(String[] args){final String str =”,圣诞快乐”;Operate func =(String s)->{System.out.println(s + str);//str =”,春节快乐。”;};//str =”,元旦快乐。”func.doSomething(“hello world”);}
2.3 C#
var str =”,圣诞快乐。”;var func =(string s)=>{Console.WriteLine(s + str );str =”,春节快乐。”;};str =”,元旦快乐。”;func(“hello world”);func(“hello world”);
2.4预测
JavaScript 和C#的结果是一样的,输出结果为:
hello world,元旦快乐。hello world,春节快乐。
可见,在表达式执行的这时候,会取当时str的值。在表达式定义的这时候,虽然引用了表达式str,但此时固定了str的值。
在表达式中改变了str的值,会改变外部str的值。
Java的范例中,要求str是final的才行,所以是无法对str改变的。
3.作为方式的参数
在JavaScript中,经常会用到类似于callback的回调方式,所以斜线表达式是不是也能呢?
3.1 JavaScript
let func =(s)=>{console.log(s);};var showLog = function(str,action){action(str);}showLog(“hello world”,func);
3.2 Java
本例用Consumer代替了第一节中的自定义的OperateUSB。其实Consumer是框架帮我们预定义的泛型USB,避免我们总需自定义三个USB:
public static void main(String[] args){Consumer func =(String s)->{System.out.println(s);};showLog(“hello world”,func);}public static void showLog(String str, Consumer action){action.accept(str);}
3.3 C#
本例用Action代替了第一节中的自定义的delegate。其实Action是框架帮我们预定义的泛型USB,避免我们总需自定义委托:
public static void Main(string[] args){var func =(string s)=>{ Console.WriteLine(s);};showLog(“hello world”, func);}public static void showLog(string str ,Action action){action(str);}
4.总结
总体来说,三种语言的采用方式还是比较类似于的。可能是都源于C的原因?
其实对于面向语言来说,好多都是相通的,个人感觉经常对比一下,有助于加深记忆。
另外,如果有机会,学一门风格和他们擅长的开发语言差异比较大的,更有利于对编程语言的了解。
————————————————
版权声明:本文为CSDN博主FlyLolo的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lolocsdn/article/details/122159246