首先,lambda到底应不应该学,我认为这个问题其实没有回答。很多人会说lambda学了也不怎么用,可读性还差,但是其实至少一般的人是觉得lambda学的时候麻烦,或者有点不理解,懒得学吧,我这里的回答是,学了就算不用,但是学会某个技术肯定是没有坏处的。
OK,我们来写一个例子。
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.sort((a,b)->{
if (a>b){
return 1;}else {
return -1;}});
}
显而易见,这里是一个给list排序的操作,可以看到,sort方法其实是需要传一个比较器进去的,但是这里的比较器呢,其实传进去也只是给sort方法提供一个比较函数,因为java是严格的面向对象的程序,所以这里即使只需要我们定义一个比较规则,但是还是需要传一个对象进去。如果写成最复杂的形式甚至还要定义一个类继承比较器接口然后再new这个类的实例,再传入。
匿名内部类显然简化了这一操作,但是这样写出来的代码往往不够美观。而如果使用lambda表达式可以写出很优雅的代码(如上)。
至于lambda到底怎么写,我认为主要是两点。首先()之中需要写参数,其次{}中把函数体写上。这里注意一下,如果参数只有一个的话可以省略(),如果函数体中只有一条语句且没有返回值的话,可以省略大括号。
那具体的()与{}中的内容如何写呢,我们可以点进比较器的接口中看一看代码。
int compare(T o1, T o2);
是的,我们只需要实现这个方法便可以了,在确定泛型的情况下,这里的两个参数类型是已经确定了,所以我们只要在()中随便写两个参数名便可以了,不用把参数类型也写上。
接下来我们只需要把匿名内部类中方法实现的方法体写在上面的{}中便可以了。
以上。
(补充:根据最近的工作来看,不学这些lambda、包括新出的stream,确实用不到但是只要学了之后,在平时写代码中会大量的写到这些代码,使用这些技术可以节省大量的开发时间,所以还是很有必要学习的)