深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

Java 8 Lambda 、MethodReference、function包

       多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身。此外在使用OGNL库时,也是知道它可以支持Lambda。但是OGNL中的lambda毕竟不是java语言本身支持,操作有诸多不便,使用Lambda不就是为了方便吗。但是Java中迟迟没有支持Lambda。直到Java 8的来临,总算给Java注入了这个新鲜血液。

1、default Method or static method in interface 1.1 default method

       Java 8 之前,为一个已有的类库增加功能是非常困难的。具体的说,接口在发布之后就已经被定型,除非我们能够一次性更新所有该接口的实现,否则向接口添加方法就会破坏现有的接口实现。Default method的目标即是解决这个问题,使得接口在发布之后仍能被逐步演化。

       Default method,即接口中声明的方法是有方法体的方法,并且需要使用default关键字来修饰。

       举个例子:java.util.Collection是线性表数据结构的统一接口,java 8里为它加上4个方法: removeIf(Predicate p)、spliterator()、stream()、parallelStream()。如果没有default method,

就得对java.util.Collection、java.util.AbstractCollection、java.util.Set 等,还有很多用户自定义的集合添加这4个方法,如果不添加,这些代码在jdk8上运行就会失败。

       而使用default method,就可以完美解决这个问题。只要在java.util.Collection中将这4个新加的方法设置为default即可。

       在引入default方法后,可能会带来如下问题:

1)一个类ImplementClass直接实现(中间没有父类)了两个接口 InterfaceA, InterfaceB,这两个接口中有同一个方法: void hello()。那么ImplementClass必须重写方法hello,不然不知道到底继承哪个,这里不会去管接口中的default

2) 一个类ImplementClassA 直接实现了接口InterfaceA,InterfaceA中定义了一个非default的void hello()方法。有另外一个接口InterfaceB,定义了一个default方法void hello();现在有一个实现类ImplementClassAB,extends了ImplementClassA,implements了InterfaceB, 且ImplementClassAB没有重写void hello()方法。那么在调用ImplementClassAB#hello()时,到底是调用的是ImplementClassA#hello(),还是调用的是InterfaceB#hello()呢?

为了解决这个问题,有这么一项原则:类的方法优先调用。所以应该是调用ImplementClassA#hello()。

  

1.2 static method

       与此同时,java8在接口中也引入了static method,它也是有方法体的,需要使用static关键字修饰。另外要特别注意的是:如果一个类中定义static方法,那么访问这个方法可以使用ClassName.staticMethodName、instance.staticMethodName两种方式来访问static方法,但是对于接口中定义的静态方法,只能通过InterfaceName.staticMethodName方式来访问。

 

2、Lambda

Lambda官方教程地址:

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

2.1 Lambda用在什么地方?

 

Anonymous Classes, shows you how to implement a base class without giving it a name.
Although this is often more concise than a named class, for classes with only one method,
even an anonymous class seems a bit excessive and cumbersome.
Lambda expressions let you express instances of single-method classes more compactly.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfwjw.html