Java的lambda表达式可以大大简化Java的代码,Java令人诟病的一个地方就是,代码太繁琐,同样的功能使用pythong语言实现,可能只需要1/10的代码就可以完成,但是使用Java写,却会有一段的“废话”,令人很不爽,因此,java8引入了lambda表达式,致力于解决这个问题。
下面用一个简单的例子说明,比如我们要遍历一个集合,最麻烦的写法是:
1
2 3 4 5 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; for ( int i = 0 ; i < friends. size ( ) ; i ++ ) { System. out. println (friends. get (i ) ) ; } |
稍微改进一下,就变成
1
2 3 4 5 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; for ( String name : friends ) { System. out. println (name ) ; } |
在Java8中,提供了一个forEach接口,来实现类似的遍历功能:
1
2 3 4 5 6 7 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; friends. forEach ( new Consumer <String > ( ) { public void accept ( final String name ) { System. out. println (name ) ; } } ) ; |
初一看,更加麻烦了,但这个只是原始版本。这个forEach就是有点点函数式编程的味道,它接收一个接口,用来处理集合里的数据。这个接口的部分定义如下:
1
2 3 4 |
@FunctionalInterface
public interface Consumer <T > { void accept (T t ) ; } |
关注一下那个FunctionalInterface,表示这个是一个函数式的接口,这种接口,就可以用来函数式编程,做成一些lambda表达式之类的。
基于这个函数式的接口,我们可以简化上面的写法:
1
2 3 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; friends. forEach ( ( final String name ) -> System. out. println (name ) ) ; |
这样看起来是不是方便很多了?->的左边表示参数类型和参数名字,右边是接口的实现,java会帮你生成那个函数式接口的一个匿名类。
这还没完,可以接续简化:
1
2 3 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; friends. forEach ( (name ) -> System. out. println (name ) ) ; |
因为java都已经知道了是什么接口,参数类型当然知道啦,所以没必要写出来,所以可以省略了,这样是不是更简单呢?
这还没完呢,既然是函数式接口,Java知道了接口的定义,参数,以及参数类型都知道了,为什么还要累赘的写出来呢,大家不是觉得java很繁琐吗?那么现在,将简洁进行到底吧!
1
2 3 |
final List
<String
> friends
=
Arrays. asList ( "Brian", "Nate", "Neal", "Raju", "Sara", "Scott" ) ; friends. forEach ( System. out ::println ) ; |
好了,这些连参数也省了。一句话就遍历了一个集合,就指名了一个方法的引用。
可以看到java还是努力再改变自己,但是从我个人的感觉出发,我觉得写到这样就差不多了
1
|
friends.
forEach
(
(name
)
->
System.
out.
println
(name
)
)
;
|
省略太多,其实对可读性来说并不是太好。毕竟代码是写给人看的。
今天就说到这里,以后有时间,会继续分享一些java8的新特性。