前一段事件在做项目的时候,看见项目里的很多地方都采用到了Java 8新特性的Lambda表达式进行编写,说实话,一开始的时候确实很让我觉得难以理解,可能是天生的对于新生的事物有一种莫名的抵触感吧。但是仔细的去了解和学习了一下,发现它并没有什么新的东西,无非是提高了编写代码的效率,当然其中也添加很很多有用的方法,对于开发者来说,确实是福音,我觉得Lambda的本质就是语法糖罢了,通俗的来说就是约定的一种规则吧。
那么我们可以使用Lambda表达来做什么呢?
在这之前我们先看看我们是怎么使用Lambda表达式的:
需要传参数进来的:
(params)->statement;
(params)->expression
(params)->{statement}
什么参数都不传的情况:
()->statement
其实我觉得一般看到这里就知道Lambda是怎么回事了。对的,他就是函数式编程的简写,比如当我们写一个函数的时候:
void show(String name){
System.out.println(“name=”+name);
}
我们一般都是这样的额,但是当你使用Lambda表达式就可以变成:
(x->System.out.println(“name”+name))
以前很多行的代码就变成了简单的一行。
接着我们再来看看使用Lambda表达式对于匿名内部类的一些处理:
比如用创建一个线程来说:
我们常见的是不是就是这种:
new Thread(new Runnable(){
@Override
public void run(){
system.out.println(“Carina is a good girl”);
}
}).start();
然后我们再来看看使用Lambda表达式的情况下:
new Thread(x->System.out.println(“LambdaCarina is a good girl”)).start();
Ps:添加监听器的方式也是一样的。
这样一对比是不是就显得简洁的多,是不是感觉棒棒哒,嘻嘻。我感觉我可以省很多的功夫,于是就继续的看下去:(因为项目中用的比较多的情况就是对于集合的一些的应用)
首先我们定义一个集合:
List<String> list = Arrays.toList(“john”,”love”,”her”);
我们一般遍历这个集合使用的是for,或者foreach是把:
for(String s:list){
System.out.println(“s=”+s);
}
for(int i=0;i<list.size();i++){
System.out.println(list[i]);
}
那我们按照惯例来看看使用Lambda表达式的方法来:
List<String> list = Arrays.toList(“john”,”love”,”her”);
list.stream().forEach(x->System.out::println);//x->也可以去掉哦
想不到就是这么简洁,以前几行的,现在一行就可以搞定,我也是觉得醉了,于是我爱上了Lambda表达式的使用。
于是这个时候我就想,难道Lambda表达式就仅仅可以遍历?如果我要改变里面集合的元素呢?我该怎么办?于是我就又去查找资料,发现,如果先要改变里面的元素,我们就只需要添加一个map就可以了:比如:上面的,我想把他的字母都变成大写的,或者添加点东西:
list.stream().map(x->x.toUpperCase()).forEach(System.out::println);
list.stream().map(x-x+” ”+”hehe”).forEach(System.out::println);
有没有感觉很强大?哈哈
了解过hadoop的应该知道里面有map和reduce函数,一个是处理,一个是计算,在Lambda表达式也是同样存在这reduce的,我们可以使用这个进行计算,得到结果。
List<Integer> list =Arrays.toList(100,200,300);
我们要计算这个集合的总和:
List.stream().reduce((sum,x)->sum+x).get();这个就可以了,我觉得用起来真的是很舒服。
好了,关于Lambda表达式的介绍就到这里了,它还有很多其它很棒的功能,比如去重distinct,比如过滤filter等等,我觉得这些需要自己动手去实践一般会更好,最好是把以前写过的代码拿出来重新写一遍,我觉得就很容易的,不怕笑,我就是这样做的,嘻嘻。