一些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项的函数,那么它应该是这样的:
可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:
lambda表达式
一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。定义第二个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项的函数,那么它应该是这样的:
可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:
lambda表达式
一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。定义第二个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。
相关文章推荐
- java lambda表达式学习笔记
- JAVA 8 StreamAPI 和 lambda表达式 总结(四)--stream的一些聚合操作
- 【Java学习笔记之三十一】详解Java8 lambda表达式
- [学习笔记] Java核心技术 卷一:基础知识 接口、lambda表达式与内部类(三)
- java8新特性学习笔记(一) Lambda表达式
- Java8新特性Lambda表达式的一些复杂用法总结
- Java8 学习笔记--函数式接口与lambda表达式的关系
- java lambda表达式 闭包学习笔记
- Java Lambda 表达式学习笔记
- Java8学习笔记 — 【Lambda表达式】
- 一、JAVA8学习笔记 Lambda表达式快速入门
- java8实战之Lambda表达式笔记
- Java学习笔记-Lambda表达式及內建函数式接口
- java8学习笔记之lambda表达式
- Java8学习笔记之Lambda表达式
- java8 lambda表达式的一些用法
- java lambda表达式学习笔记
- java8 Lambda表达式的一些特点
- Java8学习笔记----Lambda表达式 (转)