今天在练习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方法就是单纯的。