【爱上Java8】一步一步走进 java8 lambda表达式

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的新特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值