您的位置:首页 > 编程语言 > Java开发

一些java lambda表达式的笔记

2016-10-09 13:08 495 查看

函数式编程

http://www.open-open.com/lib/view/open1430532743068.html

引用来源

开始

在练习java并发编程的时候IDE出现了一个很有趣的提示:创建线程并调用run()方法时可以使用lambda表达式。

 

这是啥?好像之前在Java的书里面听说过这个东西,但是从来没有用过。按照IDE的建议,按下“修改”。原本复杂的代码一下子变成了自己看不懂的模样:



呃,run()方法呢?

run()方法跑到那个花括号里面去了吧。那么那个花括号之前的空白括号是什么意思?那个像是链表指针的箭头又是什么意思?

回顾

其实,lambda表达式只不过是函数式编程的一种形式,其中Java8支持的lambda表达式是其中一种规定的写法而已。那么什么是函数式编程呢?与其相对的是命令式编程。我们对命令电脑“新建一个变量”,“把变量值设为2”,“将这两个变量相加,把结果放到另外一个变量里”已经习以为常了。在函数式编程思想中,只有函数,没有变量。函数作为参数,函数作为一切。程序就是一个函数嵌套另一个函数,最终组成一个超级大的函数:输出只和输入有关。虽然按照这样的思想,有一些问题比如状态记录,临时变量等产生,但是现在已经有对应的解决方法。到头来主流的编程语言都或多或少支持函数式编程的一些特性,Java的lambda表达式支持也是一种。

记得斐波那契数列吗?它的特点是每一项的值等于前两项之和。如果是一个命令式编程思想指导下的计算斐波那契数列第n项的函数,那么它应该是这样的:

执行一次fib()方法,其中有一个不断循环的for语句,直到找到正确的结果后输出。从逻辑上来说,这个代码块的确是在“计算第n项的斐波那契数”,并且输出了结果。

可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:

简洁哭了好吗?虽然迭代调用本身函数不见得性能更好,但是这代码一目了然,根本不需要设置什么变量来存中间值,每一步算出的结果直接丢到下一次迭代的参数里去。

lambda表达式

一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。

在这个lambda表达式例子里,首先定义的是一个存放一组double类型数据的List。我们想知道对这组数据每个数据乘以0.55以后的值之和。使用新增的Stream API能够又快又好地处理集合中的数据。

定义第二个double类型变量用于存放总值:使用stream().map()方法使用lambda表达式,可以看到map()的参数里大概是()->()这种形式。这里头的“sala”是随手打的一个临时变量,完全不需要声明,Java根据上下文就懂了这应该是一个double类型。(如果不说明salary是<Double>类型的话,这个sala会被当成Object类的)

stream()也顾名思义是salary里一组double变量挨个儿进行map()中的操作了。这个操作看起来很陌生,其实类似"sala=sala+.55*sala",或者类似一个循环,循环里对每个salary元素进行这个运算操作。然后调用reduce()方法,告诉它将八个结果累加,然后get()到bill变量里,输出bill。

函数式编程

http://www.open-open.com/lib/view/open1430532743068.html

引用来源

开始

在练习java并发编程的时候IDE出现了一个很有趣的提示:创建线程并调用run()方法时可以使用lambda表达式。

 

这是啥?好像之前在Java的书里面听说过这个东西,但是从来没有用过。按照IDE的建议,按下“修改”。原本复杂的代码一下子变成了自己看不懂的模样:



呃,run()方法呢?

run()方法跑到那个花括号里面去了吧。那么那个花括号之前的空白括号是什么意思?那个像是链表指针的箭头又是什么意思?

回顾

其实,lambda表达式只不过是函数式编程的一种形式,其中Java8支持的lambda表达式是其中一种规定的写法而已。那么什么是函数式编程呢?与其相对的是命令式编程。我们对命令电脑“新建一个变量”,“把变量值设为2”,“将这两个变量相加,把结果放到另外一个变量里”已经习以为常了。在函数式编程思想中,只有函数,没有变量。函数作为参数,函数作为一切。程序就是一个函数嵌套另一个函数,最终组成一个超级大的函数:输出只和输入有关。虽然按照这样的思想,有一些问题比如状态记录,临时变量等产生,但是现在已经有对应的解决方法。到头来主流的编程语言都或多或少支持函数式编程的一些特性,Java的lambda表达式支持也是一种。

记得斐波那契数列吗?它的特点是每一项的值等于前两项之和。如果是一个命令式编程思想指导下的计算斐波那契数列第n项的函数,那么它应该是这样的:

执行一次fib()方法,其中有一个不断循环的for语句,直到找到正确的结果后输出。从逻辑上来说,这个代码块的确是在“计算第n项的斐波那契数”,并且输出了结果。

可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:

简洁哭了好吗?虽然迭代调用本身函数不见得性能更好,但是这代码一目了然,根本不需要设置什么变量来存中间值,每一步算出的结果直接丢到下一次迭代的参数里去。

lambda表达式

一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。

在这个lambda表达式例子里,首先定义的是一个存放一组double类型数据的List。我们想知道对这组数据每个数据乘以0.55以后的值之和。使用新增的Stream API能够又快又好地处理集合中的数据。

定义第二个double类型变量用于存放总值:使用stream().map()方法使用lambda表达式,可以看到map()的参数里大概是()->()这种形式。这里头的“sala”是随手打的一个临时变量,完全不需要声明,Java根据上下文就懂了这应该是一个double类型。(如果不说明salary是<Double>类型的话,这个sala会被当成Object类的)

stream()也顾名思义是salary里一组double变量挨个儿进行map()中的操作了。这个操作看起来很陌生,其实类似"sala=sala+.55*sala",或者类似一个循环,循环里对每个salary元素进行这个运算操作。然后调用reduce()方法,告诉它将八个结果累加,然后get()到bill变量里,输出bill。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息