lamda表达式动态实现接口

在使用MockMvc测试接口的时候,在使用MockMvcResultMatchers.view().name("")的时候进入name方法看了一下,发现了一个有意思的代码:

public ResultMatcher name(String expectedViewName) {
        return (result) -> {
            ModelAndView mav = result.getModelAndView();
            if (mav == null) {
                AssertionErrors.fail("No ModelAndView found");
            }

            AssertionErrors.assertEquals("View name", expectedViewName, mav.getViewName());
        };
    }

这里返回了一个lambda表达式。明明返回类型为ResultMatcher,为啥可以返回lambda表达式,然后查看ResultMatcher的源码:

@FunctionalInterface
public interface ResultMatcher {
    void match(MvcResult var1) throws Exception;
}

发现ResultMatcher只是一个有一个matcher方法的接口,matcher方法里的参数为MvcResult类型。
所以lambda表达式i的result相当于是对应这个MvcResult类型的参数。
则整个name方法里返回这个lambda表达式相当于返回了对应的ResultMatcher,相当于用lambda表达式匿名实现了这个接口的类的实例,其实这种做法就相当于new ResultMatcher{}然后再花括号内实现方法(匿名接口实现)。

 

 

你可能感兴趣的:(JAVA)