Java8 lambda表达式

来源:互联网 发布:文件夹整理软件 编辑:程序博客网 时间:2024/04/28 14:51
  lambda表达式是Java8中的一个重大的新特性,它提供了简洁明了的形式来表达一个接口中的方法。
  比如如果想要写一个监听器的话,其步骤为,我先写一个Handler接口,然后被监听者里面要有Handler接口的对象,然后写上Handler接口的setter方法,最后,监听者得到被监听者的对象后,设置其Handler对象:

  下面我以Spring MVC的一个例子做讲解,这个例子是得到传入Controller的请求:


@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


1 0