调整到合适的心态
想要尝试运用最新的特性编写出更加高效和整洁的代码,你必须了解一下几个新的概念--好吧,至少鄙人需要。什么是lambda表达式?
最简单的看待lambda表达式的方式就是,你可以把它看做一个方法:”它提供一系列的正式的参数和一个通过这些参数来表述逻辑的方法体---它可以是一个表达式或者一个代码段。lambda表达式的参数可以是声名的或者引用的,当这些参数是引用类型的时候,那么这些类型就是源于针对lambda表达式的功能性接口。从返回值来看,一个lambda表达式可以是无返回值的--它们不返回任何结果,或者是有返回值的--在表达式里面的某个执行语句返回一个值。
下面是一个lambda表达式的例子:
01 | (a) ( int a, int b) -> a + b |
03 | (b) ( int a, int b) -> { |
什么是功能性接口呢?一个功能性接口就是一个只含有抽象方法的接口,只是声名了一个函数。在某些场合下,这个唯一的函数可能是一个带有重载因子的的多态函数,这种情况下,所有的函数对外都是一个函数。除了典型的通过新建和初始化一个类来新建一个接口实例,功能性接口实例还可以通过使用一个lambda表达式、方法、或者构造引用来达到新建实例的效果。下面是一个功能性接口的例子:
2 | public interface FuncInterface { |
3 | public void invoke(String s1, String s2); |
下面是来自java api的功能性接口:
3 | java.util.concurrent.Callable |
4 | java.awt.event.ActionListener |
接下来让我们来看看一个线程的启动在future中可能会发生怎么的变化:
旧方式:
1 | new Thread( new Runnable() { |
4 | for ( int i= 0 ; i< 9 ; i++) { |
5 | System.out.println(String.format( "Message #%d from inside the thread!" , i)); |
新方式:
2 | for ( int i= 0 ; i< 9 ; i++) { |
3 | System.out.println(String.format( "Message #%d from inside the thread!" , i)); |
即使我还没有写过与java swing,AWT相关的功能,但是我还是可以断定:lambdas肯定会给那些Swing开发者带去很多的便利。
动作监听:
01 | JButton button = new JButton( "Click" ); |
04 | button.addActionListener( (e) -> { |
05 | System.out.println( "The button was clicked!" ); |
09 | button.addActionListener( new ActionListener() { |
11 | public void actionPerformed(ActionEvent e) { |
12 | System.out.println( "The button was clicked using old fashion code!" ); |
什么是SAM?SAM 是单个抽象方法的替代,因此,直接一点,我们可以说SAM==功能性接口。即使在最初的规范里面,只有一个抽象方法的抽象类被认为是SAM类型的,很多人还是发现/猜出了这样定义的原因。
方法/构造方法 引用