Lambda表达式是java jdk8之后的一个新特性,最直观的作用是可以使得代码简洁,使用最多的就是接口的实现这一块,可以操作数组,集合等,尤其是在集合的遍历和其他集合操作过程中,可以极大优化代码的结构。接下来我就直接介绍Lambda的语法再简单的写一个入门案例,旨在复习一天所学内容,可以更好的理解函数式编程,以及对接口实现的方法有更加深刻地认识!
Lambda介绍
首先,我们可以思考一个问题,我们是否可以将一个代码块例如
public void doSomeShit(String s){
System.out.println(s);
}
赋值给一个变量?
在jdk8之前是做不到的,但是在jdk8之后,Java引入了Lambda表达式之后就可以实现了
aBlockCode=public void doSomeShit(String s){
System.out.println(s);
}
当我们把一个代码块赋值给一个变量之后,我们就会思考,这个变量是什么类型的?
答案是:接口类型,Lambda表达式也可以这样说,Lambda表达式本身就是一个接口的实现
我们实现接口有两个方法,一个是implement 接口,另一个方法就是new 接口,通过匿名内部类来实现,现在我们又可以通过Lambda表达式来实现接口
但是,我们如果使用Lambda表达式实现接口时,我们对这个接口是有要求的,它规定接口中只能有一个需要被实现的方法,但是并不是规定接口中只有一个方法(因为在jdk8之后加入了default,被default修饰的方法会有默认实现,不是必须被实现的方法,所以不影响Lambda表达式的使用。)
Lambda表达式的语法和使用
Lambda表达式的语法形式为()->{}
()中写实现方法中所需要的参数,{}中写方法体 ->为运算符不可以省略,()和{}遇到一个参数和一个执行语句的时候可以简化不写
下面是一些测试代码
package lambda;
/**
* 无返回值,无参数
*/
@FunctionalInterface
interface noRetrunNoParam{
void method();
}
/**
* 无返回值,有一个参数
*/
@FunctionalInterface
interface noRetrunOneParam{
void method(int a);
}
/**
* 无返回值,有多个参数
*/
@FunctionalInterface
interface noRetrunMultiParam{
void method(int a,int b);
}
/**
* 有返回值,无参数
*/
@FunctionalInterface
interface RetrunNoParam{
String method();
}
/**
* 有返回值,有一个参数
*/
@FunctionalInterface
interface RetrunOneParam{
String method(String str);
}
/**
* 有返回值,有多个参数
*/
@FunctionalInterface
interface RetrunMultiParam{
String method(String str1,String str2);
}
public class Test {
public static void main(String[] args) {
noRetrunNoParam n1=()->{
System.out.println("noRetrunNoParam");
};
n1.method();
noRetrunOneParam n2=(a)->{
System.out.println(a);
};
n2.method(2);
noRetrunMultiParam n3=(int a,int b)->{
System.out.println(a+b);
};
n3.method(3,2);
RetrunNoParam n4=()->{
return "你好";
};
System.out.println(n4.method());
RetrunOneParam n5=(str)->{
return "你好"+str;
};
System.out.println(n5.method("张三"));
RetrunMultiParam n6=(String str1,String str2)->{
return str1+str2;
};
System.out.println(n6.method("你好","北京"));
}
}
Lambda表达式创建线程
package lambda;
public class LambdaThread {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"开始");
Thread thread=new Thread(()->{
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName());
}
},"LambdaThread");
thread.start();
System.out.println(Thread.currentThread().getName()+"结束");
}
}
Lambda表达式操作集合
package lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
class ConsumerImpl implements Consumer{
@Override
public void accept(Object o) {
System.out.println(o);
}
}
public class ListLambda {
public static void main(String[] args) {
List<String > list=new ArrayList<>();
list.add("a");
list.add("d");
list.add("b");
list.add("c");
//使用lambda表达式进行接口的实现来遍历集合
list.forEach(System.out::println);
//使用lambda表达式进行接口的实现来删除集合中某个元素
list.removeIf(ele->ele.equals("a"));
list.forEach(System.out::println);
//使用lambda表达式进行接口的实现来对集合中的元素进行排序
list.sort((o1,o2)->o1.compareTo(o2));
list.forEach(System.out::println);
}
}