聊一聊JavaScript和Java、C 的“箭头函数”

2022-11-24 0 963

ES6中导入了斜线表达式,这也是那时后端复试基本上必修的文本(董灿斜线表达式,我都不耐烦说他们是辩手,呵呵,开个笑话)。没人问我,斜线表达式是个甚么小东西?我跟他说,就像Java和C#中的lambda。

聊一聊JavaScript和Java、C 的“箭头函数”

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

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务