Java函数式编程笔记(一)
什么是函数式编程
这个问题能够看英文的Wiki,我比较懒不想翻译了ㄟ( ▔, ▔ )ㄏ。若是想详细理解能够看下知乎的讨论 简单说下函数式编程的特色:express
- 函数是一等公民。(大概地位就是和基本类型同样吧)
- 变量不可变。(函数里面操做的变量应该是不能被改变的)
- 惰性求值什么的(这个平时编程估计感觉不到)
为何要使用Lambda表达式
- 代码会很简洁
- 更高层次的抽象
- 处理回调函数和事件的时候更加方便
Java 8的Lambda表达式
Java 8的Lambda表达式的写法
基本形式: (参数)->{表达式} BinaryOperator<Long> add = (Long x, Long y) -> {x + y};编程
Ps:编程语言
- 若是只有一行语句,能够省略表达式的大括号。 例如:Runnable singleStatement = () -> System.out.println("hello world");
- 若是只有一个参数,能够省略参数的括号。 例如:ActionListener oneArgument = event -> System. out.println(" button clicked");
- 参数能够不加类型声明,Lambda 表达式的类型依赖于上下文 环境, 能够由编译器推断出来的。 例如:BinaryOperator< Long> add = (x, y) -> x + y;
- 没有参数的时候,不能省略括号。 例如:Runnable singleStatement = () -> System.out.println("hello world");
值引用,而不是地址
在Java 8之前使用匿名内部类的时候,内部使用外部引用类型的变量,都须要将变量声明为final。在Lambda表达式中一样如此,只是Java 8放松了这一限制,能够引用非final变量,可是该变量在既成事实上必须是final。若是给传入Lambda表达式中的变量屡次赋值,编译器就会报这样一个错误: 信息: local variables referenced from a Lambda expression must be final or effectively final。
函数式编程
函数接口
定义:函数接口是只有一个抽象方法的接口, 用做Lambda表达式的类型。
Ps:其实和之前没有Lambda表达式,声明回调接口的方式是同样的。最起码都是这么用的,不过如今若是想写成Lambda表达式的形式,是不能声明一个以上的抽象方法的。函数
Java 8提供的函数接口:

参考:
- 维基百科 函数式编程 https://www.wikiwand.com/en/Functional_programming
- 维基百科 编程范性 https://www.wikiwand.com/zh/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B
- 维基百科 函数式编程语言 https://www.wikiwand.com/zh/%E5%87%BD%E6%95%B8%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80
- [英]沃伯顿(Richard Warburton). Java 8函数式编程 (图灵程序设计丛书) 人民邮电出版社. Kindle 版本.