《Java8语言新特性.ppt》由会员分享,可在线阅读,更多相关《Java8语言新特性.ppt(20页珍藏版)》请在三一办公上搜索。
1、谭泽宇 2017-11-06,Java8语言新特性,背景,Java是一门面向对象编程语言。面向对象编程和函数式编程语言中的基本元素都可以动态封装程序行为:面向对象编程语言使用带有方法的对象封装行为,函数编程语言使用函数封装行为。,缺点:1.语法过于冗余2.匿名类中使用this和变量名容易使人产生无解3.类型载入和实例创建语义不够灵活4.无法捕获非final的的局部变量,什么是函数式编程,函数式编程最重要的基础是演算(lambda calculus),而演算的函数可以接受函数当作输入和输出。,map-映射filter-过滤reduce-换算,FunctioinalInterface,此注解的目的
2、就是避免无疑生命了一个符合函数式标准的接口,加上这个注解来显示制定一个接口是函数式接口,编译器就会验证该接口是否满足函数式接口的要求。,Java SE 7,Java SE 8新增Predicate接收T并返回booleanConsumer接收T,不返回值Function接收T,返回RSupplier提供T对象,返回TUnaryOperator接收T对象,返回TBinaryOperator接收两个T,返回T等等,lambda表达式,匿名类型最大的问题就在于其冗余的语法;比如前面ActionListener的例子里的5行代码实际工作的有效代码只有一行。lambda表达式是匿名方法,提供了轻量级的语
3、法。,表达式:表达式会被执行然后返回执行结果。语句块:语句块中的语句会被依次执行,就像方法中的语句一样return 语句会把控制权交给匿名方法的调用者break 和 continue 只能在循环中使用如果函数体有返回值,那么函数体内部的每一条路径都必须返回值,试试看,目标类型,给定的lambda表达式,它的类型是什么?,它的类型是由上下文推导而来的。,例如,下面代码中的lambda表达式类型是ActionListener,这就意味着同样的 lambda 表达式在不同上下文里可以拥有不同的类型,目标类型,编译器会检查 lambda 表达式的形式参数类型和目标类型的方法签名是否一致。当且仅当下面所
4、有条件均满足时,lambda 表达式才可以被赋给目标类型 T:T 是一个函数式接口lambda 表达式的参数和 T 的方法参数在数量和类型上一一对应lambda 表达式的返回值和 T 的方法返回值相兼容lambda 表达式内所抛出的异常和 T 的方法 throws 类型相兼容,目标类型,由于目标类型(函数式接口)已经“知道”lambda表达式的形式参数类型,所以没有必要把已知类型再重复一遍;lambda 表达式的参数类型可以从目标类型中得出。,编译器可以推导出s1和s2的类型是String。Tip:当lambda的参数只有一个而且它的类型可以被推到得知时,参数外面的括号可以省略。,目标类型的上
5、下文,变量申明&赋值,返回语句,数组初始化器,目标类型的上下文,三元运算符,转型表达式,lambda表达式函数体,方法和构造方法的参数,词法作用域,lambda 表达式的语义就十分简单:它不会从超类中继承任何变量名,也不会引入一个新的作用域。lambda 表达式基于词法作用域,也就是说 lambda 表达式函数体里面的变量和它外部环境的变量具有相同的语义(也包括 lambda 表达式的形式参数)。此外,this 关键字及其引用在 lambda 表达式内部和外部也拥有相同的语义。,变量捕获,在Java 7中,编译器要求内部类中引用的外部变量(即捕获的变量)需要使用 final 修饰。Java8中
6、对于lambda表达式和内部类放宽了这个限制,允许在其中捕获那些符合有效只读(Effectively final)的局部变量。,尽管放宽了限制,但是修改捕获变量还是被禁止的。,wrong,方法引用,lambda表达式允许我们定义一个匿名方法,也允许通过方法名称引用已有的方法。,方法引用的种类,静态方法引用:ClassName:methodName实例上的实例方法引用:instanceReference:methodName超类上的实例方法引用:super:methodName类型上的实例方法引用:ClassName:methodName构造方法引用:Class:new数组构造方法引用:Type
7、Name:new,默认方法和静态接口方法,继承默认方法,和其它方法一样,默认方法也可以被继承,大多数情况下这种继承行为和我们所期待的一致。不过,当类型或者接口的超类拥有多个具有相同签名的方法时,我们就需要一套规则来解决这个冲突:类的方法(class method)声明优先于接口默认方法。无论该方法是具体的还是抽象的。被其它类型所覆盖的方法会被忽略。这条规则适用于超类型共享一个公共祖先的情况。,继承默认方法,我们假设 Collection 和 List 接口均提供了 removeAll 的默认实现,然后 Queue 继承并覆盖了 Collection 中的默认方法。在下面的 implement 从句中,List 中的方法声明会优先于 Queue 中的方法声明:,继承默认方法,当两个独立的默认方法相冲突或是默认方法和抽象方法相冲突时会产生编译错误。这时程序员需要显式覆盖超类方法。一般来说我们会定义一个默认方法,然后在其中显式选择超类方法,super 前面的类型必须是有定义或继承默认方法的类型,Thank You,
链接地址:https://www.31ppt.com/p-5435946.html