跳到内容
1.Java 8函数式编程
1.1.没有单子
1.2.没有语言层面的惰性求值
1.3.没有为不可变性提供额外支持
1.4.集合类可以拥有一些额外的方法:default方法
2.现实世界中,数据和行为并存
2.1.面向对象编程是对数据进行抽象
2.2.函数式编程是对行为进行抽象
3.函数式编程
3.1.在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值
3.2.关心的是如何写出好代码,而不是符合函数式编程风格的代码
3.3.使用Lambda表达式,就是将复杂性抽象到类库的过程
4.匿名内部类
4.1.目的
4.1.1.为了方便Java程序员将代码作为数据传递
4.2.传入一个实现某接口的对象
4.3.显式地声明参数类型
5.Lambda表达式
5.1.一个匿名方法,将行为像数据一样进行传递
5.1.1.一种紧凑的、传递行为的方式
5.1.2.传入了一段代码块——一个没有名字的函数
5.1.3.无需指定类型,程序依然可以编译
5.2.形式
5.2.1.不包含参数,使用空括号()表示没有参数
5.2.2.包含且只包含一个参数,可省略参数的括号
5.2.3.可以是一段代码块,使用大括号({})将代码块括起来
5.2.4.包含多个参数的方法
5.2.5.显式声明参数类型,此时就需要使用小括号将参数括起来,多个参数的情况也是如此
5.3.常见结构
5.3.1.BinaryOperator add=(x, y) → x+y
5.4.引用值,而不是变量
5.4.1.将变量声明为final
5.4.1.1.意味着不能为其重复赋值
5.4.1.2.是在使用赋给该变量的一个特定的值
5.4.1.3.Java8可以引用非final变量,但是该变量在既成事实上必须是final
5.4.2.未赋值的变量与周边环境隔离起来,进而被绑定到一个特定的值
5.4.2.1.闭包
5.5.Lambda表达式的类型依赖于上下文环境,是由编译器推断出来的
5.6.目标类型是指Lambda表达式所在上下文环境的类型
6.函数接口
6.1.只有一个抽象方法的接口
6.2.Lambda表达式本身的类型
6.3.接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可
6.3.1.为参数起一个有意义的名字,增加代码易读性
6.4.
7.类型推断
7.1.程序依然要经过类型检查来保证运行的安全性,但不用再显式声明类型罢了
7.2.省略类型信息可以减少干扰,更易弄清状况
7.3.需要类型信息帮助理解代码
7.4.一开始类型信息是有用的,但随后可以只在真正需要时才加上类型信息