java8初探

来源:互联网 发布:华为盒子看电影软件 编辑:程序博客网 时间:2024/06/18 00:24

java8已经出来很长时间了,它是自java5以来做了很大的改变的一个版本,增加了很多新的特性,所以这个版本受到了极大的关注,我们应该很有必要去了解下。

Lambda

这是java8的最重要的一个特性,java8借助这个表达式使其语法有些与以往有些不同,但是表达能力毫无疑问是很强的,它所对应的接口为函数式接口,它实际是用来替代传统的匿名内部类,比以前的匿名内部类的使用更精简理工具强表达性的植入一段过程,另外它极大的优化了实现原理,因为Lambda表达式在编译期间不会产生匿名类,运行期间也不会产生实例,所以它的性能得到了比较大的提升,使java这门面向对象的语言可以进行面向过程式的编程,把过程抽象出来作为参数并下级接口调用。关于Lambda表达式的语法,这里不作详解,如果明白原理其实也很容易上手。

以下列出相关Lambda表达式比较重要的几条说明:
1. Lambda表达式所返回的或者说所代表的类型即函数式接口类型
2. Lambda表达式只是一个闭包的声明,它里面的代码真正执行是由调用方去执行的
3. Lambda表达式所对应的具体函数式接口类型是自动推断的包括所对应的泛型参数类型,所以形参列表的类型也会自动推断
4. 形参列表为空,只需保留()
5. 形参只有1个,()可以省略
6. 执行语句只有1句情况下:{}可以省略,若有返回值也要去掉return
7. Lambda表达式不会导致在编译期间产生一个内部类字节码文件
8. Lambda表达式访问局部变量必须限定其为final的,若是局部变量没有加final,系统会自动添加,此后不可随意修改该局部变量,否则程序运行会报错

函数式接口

上面讲的Lambda表达式与函数式接口这个概念密切相关,函数式接口相比与普通的java接口唯一的不同之处就在于它只有一个抽象方法声名,不过这里不包括接口的默认方法,但这不足以表明它是函数式接口,为了增强语法的严谨性,凡是函数式接口的类上都加有注解@FunctionalInterface ,这样如果标注了这个注解的接口有多于一个抽象方法时是通过不了编译的。

java8已经为我们提供了一些具有特定用途的函数式接口:
Function接口
最通用通俗的一个函数式接口,虽然不能体现实现的业务场景,但是道出了函数式接口作用的真谛,即植入一段具有某个功能的过程,请给我一个输入T,然后经过一段处理之后给我返回R
Supplier接口
我就是一个提供对象的接口,但是这个如何generate一个T对象,这是实现方用Lambda来实现,我不负责传递任何参数,我只纯粹负责供应这个对象^_^
Consumer接口
与Supplier似乎相反,我只负责消费T对象,却不返回什么结果,那么T对象是要传递给我的参数,我接受到它,对它进行消费,如何消费是Lambda要对我实现的详细,最终消费完我不会冒出什么泡泡。。所以Supplier是纯粹的供应,Consumer是纯粹的消费。

好吧,今天就只讲到这两个java8比较核心重要的概念。但是理解反复练习是非常重要的哦!只有这样才能体会到Lambda的妙用!

原创粉丝点击