我是靠谱客的博主 故意指甲油,最近开发中收集的这篇文章主要介绍MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
default List listObjs(Function<? super Object, V> mapper)
- 首先 我们先看到的这个方法入参是:Function<? super Object , V> mapper ,这是jdk1.8为了统一简化书写格式引进的函数式接口 。
- 简单 解释一下我对Function函数的理解 , 就以上面的写法为例,可以看到Function函数要传入两个类型:
1.
? super Object
这个类型限制了下限 , 即 传入的类型必须是Object的超类,或者是Object ,所以 ,函数的第一个类型必然是 Object类型 ,后面会说为什么会是Object类型
2.
V
没有限制泛型的上下边界 , 所以可以为任何类型
3.
每个函数式接口的典型特点就是有且仅有一个可以实现的接口 , Function也不例外;看下接口部分源码:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
...
}
4. 看到这里应该明白,这个接口做的就是类型之间 T和R 的转换 ,传入T类型 ,返回R类型。
5. 那么上面的Function<? super Object, V>写法 就是说 传入Object类型 , 返回 V 类型 。
对Function接口,就说这么多 ,这里不做详细解释 ,想了解可以去自行搜索。
- 对于mp的业务方法listObjs()方法 ,我们只讨论它的泛型方法 ,下面是方法介绍
mp官网接口介绍
// 查询全部记录
1. <V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
2. <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
接口源码
1. default List<Object> listObjs() {
return this.listObjs(Function.identity());
}
2.
default <V> List<V> listObjs(Function<? super Object, V> mapper) {
return this.listObjs(Wrappers.emptyWrapper(), mapper);
}
3.
default List<Object> listObjs(Wrapper<T> queryWrapper) {
return this.listObjs(queryWrapper, Function.identity());
}
4. default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
return (List)this.getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
}
可以看到接口源码中 方法2 调用了方法4
方法4的意义是 :
this.getBaseMapper().selectObjs(queryWrapper):
拿到BaseMapper,再调用它的selectObjs方法传入queryWrapper条件,查出数据list,
stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()):
再利用流处理,过滤掉空值,筛选出mapper类型的数据,重新组成一个集合。就得到了我们所需要的List<V>数据。
这个V类型就是我们上面所说的Function中所传的泛型V,就是我们想要转换的类型。
接下来看一下我们在Service业务方法中 对Function的方法实现以及对listObjs()方法的调用。
1.先实例化出Function接口 ,实现apply接口,进行类型转换,
其中Object类型的参数是我们实体类中使用Mp的@TableId注解标注的属性,
## 由于主键属性的类型不定,所以mp只能定为Object类型来限制传参。 ##
如果没有标注注解,则根据属性名对应数据库表的字段进行匹配查找(参数一般都是主键id,除非你使用@TableId注解标注了其他字段)
Function<Object,Long> function = new Function<Object, Long>() {
@Override
public Long apply(Object id) {
//进行一系列转换操作 ,最终返回我们所需要的类型V , 这里只做简单演示。
return Long.valueOf(id.toString());
}
};
2.调用listObjs(queryWarpper,function)方法,这里queryWrapper就不做介绍。
List<Long> longs1 = listObjs(null, function);
3.经过Function的处理我们会得到表中数据的所有主键做组成的list集合。
另两种写法 , 和上面的写法一致 ,推荐最后一种。
//匿名类写法
List<Long> longs = listObjs(null,
new Function<Object, Long>() {
@Override
public Long apply(Object id) {
//进行一系列转换操作 ,最终返回我们所需要的类型V , 这里只做简单演示。
return Long.valueOf(id.toString());
}
});
//简写
List<Long> longs = listObjs(null, a ->{
return Long.valueOf(a.toString());
});
先写这么多 , 上面的理解如有错误 ,还请大佬们多多指教。
最后
以上就是故意指甲油为你收集整理的MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper)的全部内容,希望文章能够帮你解决MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复