今天在练习SpringBoot的时候,看到了以下这种写法:

//实体类:@Datapublic class Book {    private Integer id;    private String type;    private String name;    private String description;}
//测试类//实现功能:关键字查询@Testvoid testByLike(){    String name = "Spring";    LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<Book>();    lambdaQueryWrapper.like(name!=null,Book::getName,name);    bookDao.selectList(lambdaQueryWrapper);}

可以看到,测试类中使用到了这种写法:Book::getName,虽然平时看到有的源码使用到了这种写法,但我使用的还是比较少。因此对这种写法不是很了解,接下来我们就来讨论一下::


经查询,该用法是Java8引入的新特性:方法引用。其通常与lambada表达式结合来简化代码。

通过Java引用,我们能够直接引用已有java类或对象的方法或构造器

Book::getName即为:获取Book中的name属性所对应的值。

在上述代码中,该写法可以让编写者避免输错属性名。


当然,不是所有情况都能使用::方法引用。

其使用有一定的条件:lambada表达式的主体仅包含一个表达式,且lambada表达式只调用一个已经存在的方法;被引用的方法的参数列表与lambada表达式的输入输出一致

图源网络

通过上面这个图,可以很清晰的观察到方法引用使用的条件–》必须进行单纯的引用。像getter和setter方法就是单纯的。