当前位置: 首页 > ds >正文

MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper)

default List listObjs(Function<? super Object, V> mapper)

  1. 首先 我们先看到的这个方法入参是:Function<? super Object , V> mapper ,这是jdk1.8为了统一简化书写格式引进的函数式接口 。
  2. 简单 解释一下我对Function函数的理解 , 就以上面的写法为例,可以看到Function函数要传入两个类型:
	1.super Object  这个类型限制了下限 , 即 传入的类型必须是Object的超类,或者是Object ,所以 ,函数的第一个类型必然是 Object类型 ,后面会说为什么会是Object类型2.  V  没有限制泛型的上下边界 , 所以可以为任何类型3. 	每个函数式接口的典型特点就是有且仅有一个可以实现的接口 , Function也不例外;看下接口部分源码:@FunctionalInterfacepublic interface Function<T, R> {R apply(T t); ...}4. 看到这里应该明白,这个接口做的就是类型之间 TR 的转换 ,传入T类型 ,返回R类型。5. 那么上面的Function<? super Object, V>写法 就是说 传入Object类型 , 返回 V 类型 。对Function接口,就说这么多 ,这里不做详细解释 ,想了解可以去自行搜索。	
  1. 对于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,注意selectObjs方法只返回查询的第一个字段。默认查询为主键列。可以在queryWrapper指定查询出的字段列,这样下面就不是用的主键了。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>() {@Overridepublic 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>() {@Overridepublic Long apply(Object id) {//进行一系列转换操作 ,最终返回我们所需要的类型V , 这里只做简单演示。return Long.valueOf(id.toString());}});//简写List<Long> longs = listObjs(null, a ->{return Long.valueOf(a.toString());});

先写这么多 , 上面的理解如有错误 ,还请大佬们多多指教。

http://www.xdnf.cn/news/11307.html

相关文章:

  • Win10下Windows Mobile设备中心无法连接斑马PDA 、无法拷贝文件———— Windows 设备中心64位安装包
  • i春秋首届全国数据安全大赛部分复盘
  • 【吐血整理!20个CC0正版素材网站,值得珍藏】自媒体视频创作者必备
  • android wifi 网桥,史上最全无线网桥知识,收藏这一篇就够了!
  • Java实现钉钉自定义机器人接入
  • Three.js(学习)
  • 云计算基础、Iass、Pass、Sass区别
  • 6-php的web环境安装
  • 【一文带你了解bluetooth】
  • 凶残的挖矿脚本,奴役我数千机器!
  • Google Web Designer for mac(专业网站设计工具)
  • 什么是金叉、死叉
  • java soap api操作和发送soap消息
  • numpy中的nonzero()
  • 什么是ip数据库
  • 安装 Windows 7 VM虚拟机
  • 重装系统基础教程
  • layout布局_关于 layout_weight,你到底知多少
  • 硅基流动完成近亿元融资:加速生成式AI技术普惠进程
  • 想要自己制作一款游戏,需要掌握哪些基本技能
  • android HorizontalScrollView讲解
  • 3D动画软件
  • 电脑操作系统的安装
  • RapidXML的使用
  • Qt 是一个功能强大的跨平台开发框架
  • match_parent和wrap_content的区别
  • C++语法基础--ostream,cout及其格式控制,缓冲区
  • electron一键生成项目图标
  • 抖音短视频常用的scheme跳转协议地址,直播间Intent跳转
  • 华为“天才少年”有多牛?入职不到一年,算法就用于千万台华为手机