lambda表达式是Java8中的一个重大的新特性,它提供了简洁明了的形式来表达一个接口中的方法。
比如如果想要写一个监听器的话,其步骤为,我先写一个Handler接口,然后被监听者里面要有Handler接口的对象,然后写上Handler接口的setter方法,最后,监听者得到被监听者的对象后,设置其Handler对象:
public class LambdaController {
private OnRequestHandler onRequestHandler;
@ResponseBody
@RequestMapping(value = "/testLambda")
public String testRequest(){
onRequestHandler.onRequest();
return "testLambda";
}
public void setOnRequestHandler(OnRequestHandler onRequestHandler) {
this.onRequestHandler = onRequestHandler;
}
public interface OnRequestHandler {
void onRequest();
}
}
现在写一个监听者,要来监听Controller的请求事件:
@Component
public class RequestHandler{
@Autowired
private LambdaController lambdaController;
@PostConstruct
public void init() {
lambdaController.setOnRequestHandler(new LambdaController.OnRequestHandler() {
@Override
public void onRequest() {
System.out.println("RequestHandler接收到了请求");
}
});
}
}
可以看到里面最关键的代码:
lambdaController.setOnRequestHandler(
new LambdaController.OnRequestHandler() {
@Override
public void onRequest() {
System.out.println("RequestHandler接收到了请求");
}
});
我只想在收到请求的时候输出一行语句,但是却一共写了5行语句,只有一行是有用的,所以这时候就可以使用lambda表达式。
lambda表达式可以极大的简化上述写法:
这样写:
lambdaController.setOnRequestHandler(()-> System.out.println("RequestHandler接收到了请求"));
此为无参无返回值的情况,那么有参有返回值的情况为:
比如我要测试一下回调收到请求的参数,并且根据回调方法返回的值来进行判断,下面以写一个判断是否成年的接口来做测试:
现在写一下判断的接口:
public interface OnJudgeHandler {
boolean onAdultJudge(String name,Integer age);
}
然后RequestHandler再去实现这个接口:
@Component
public class RequestHandler{
@Autowired
private LambdaController lambdaController;
@PostConstruct
public void init() {
lambdaController.setOnRequestHandler((name, age)->{
System.out.println("RequestHandler接收到了请求,其中请求的参数为---"+ name +"---"+age);
if (age >= 18) {
return true;
} else {
return false;
}
});
}
}
其中,Controller回调接口的方法为:
@Controller
public class LambdaController {
private OnJudgeHandler onRequestHandler;
@ResponseBody
@RequestMapping(value = "/judgeAge")
public String testRequest(String name, Integer age){
boolean isAdults = onRequestHandler.onAdultJudge(name, age);
if (isAdults) {
return name+" is adults" +
"";
} else {
return name+" not adults";
}
}
public void setOnRequestHandler(OnJudgeHandler onRequestHandler) {
this.onRequestHandler = onRequestHandler;
}
public interface OnJudgeHandler {
boolean onAdultJudge(String name,Integer age);
}
}
可以看到,LambdaController当收到请求的信息之后,会调用回调的方法,然后在回调方法中对传入的参数进行处理。
比如如果想要写一个监听器的话,其步骤为,我先写一个Handler接口,然后被监听者里面要有Handler接口的对象,然后写上Handler接口的setter方法,最后,监听者得到被监听者的对象后,设置其Handler对象:
下面我以Spring MVC的一个例子做讲解,这个例子是得到传入Controller的请求:
public class LambdaController {
private OnRequestHandler onRequestHandler;
@ResponseBody
@RequestMapping(value = "/testLambda")
public String testRequest(){
onRequestHandler.onRequest();
return "testLambda";
}
public void setOnRequestHandler(OnRequestHandler onRequestHandler) {
this.onRequestHandler = onRequestHandler;
}
public interface OnRequestHandler {
void onRequest();
}
}
现在写一个监听者,要来监听Controller的请求事件:
@Component
public class RequestHandler{
@Autowired
private LambdaController lambdaController;
@PostConstruct
public void init() {
lambdaController.setOnRequestHandler(new LambdaController.OnRequestHandler() {
@Override
public void onRequest() {
System.out.println("RequestHandler接收到了请求");
}
});
}
}
可以看到里面最关键的代码:
lambdaController.setOnRequestHandler(
new LambdaController.OnRequestHandler() {
@Override
public void onRequest() {
System.out.println("RequestHandler接收到了请求");
}
});
我只想在收到请求的时候输出一行语句,但是却一共写了5行语句,只有一行是有用的,所以这时候就可以使用lambda表达式。
lambda表达式可以极大的简化上述写法:
这样写:
lambdaController.setOnRequestHandler(()-> System.out.println("RequestHandler接收到了请求"));
此为无参无返回值的情况,那么有参有返回值的情况为:
比如我要测试一下回调收到请求的参数,并且根据回调方法返回的值来进行判断,下面以写一个判断是否成年的接口来做测试:
现在写一下判断的接口:
public interface OnJudgeHandler {
boolean onAdultJudge(String name,Integer age);
}
然后RequestHandler再去实现这个接口:
@Component
public class RequestHandler{
@Autowired
private LambdaController lambdaController;
@PostConstruct
public void init() {
lambdaController.setOnRequestHandler((name, age)->{
System.out.println("RequestHandler接收到了请求,其中请求的参数为---"+ name +"---"+age);
if (age >= 18) {
return true;
} else {
return false;
}
});
}
}
其中,Controller回调接口的方法为:
@Controller
public class LambdaController {
private OnJudgeHandler onRequestHandler;
@ResponseBody
@RequestMapping(value = "/judgeAge")
public String testRequest(String name, Integer age){
boolean isAdults = onRequestHandler.onAdultJudge(name, age);
if (isAdults) {
return name+" is adults" +
"";
} else {
return name+" not adults";
}
}
public void setOnRequestHandler(OnJudgeHandler onRequestHandler) {
this.onRequestHandler = onRequestHandler;
}
public interface OnJudgeHandler {
boolean onAdultJudge(String name,Integer age);
}
}
可以看到,LambdaController当收到请求的信息之后,会调用回调的方法,然后在回调方法中对传入的参数进行处理。
当有参数的时候,函数体标准为(xx,xx) -> { }
此项目的地址为例子
项目的测试地址为 http://localhost:8080/judgeAge?name=happyheng&age=13