为了账号安全,请及时绑定邮箱和手机立即绑定

其中的方法的使用

<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

想问下这个方法怎么使用,搞不懂

正在回答

4 回答

       先简单解释一下。getObj方法内部又调用了listObjs。listObjs返回一个list,如果有元素的话,只取第一个,没有元素的话,返回null。第二个参数是一个Function函数式接口。就是你不想返回实体了,想返回一个自定义类型对象或其他类型对象,你要进行转换。

看源码,你就明白啦,给你show一下源码

ServiceImpl类
@Override
public <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
    return SqlHelper.getObject(log, listObjs(queryWrapper, mapper));
}
SqlHelper类
/**
 * 从list中取第一条数据返回对应List中泛型的单个结果
 *
 * @param list ignore
 * @param <E>  ignore
 * @return ignore
 */
public static <E> E getObject(Log log, List<E> list) {
    if (CollectionUtils.isNotEmpty(list)) {
        int size = list.size();
        if (size > 1) {
            log.warn(String.format("Warn: execute Method There are  %s results.", size));
        }
        return list.get(0);
    }
    return null;
}
ServiceImpl类
@Override
public <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
    return baseMapper.selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
}


0 回复 有任何疑惑可以回复我~
@Test
public void getOneTest04() {
    queryWrapper.ge("emp_age", 18);
    boolean b = employeeService.getObj(queryWrapper, (m) -> {
        Employee employee = employeeService.getById((Long)m);
        employee.setEmpPhone("-----");
        boolean flag = employeeService.updateById(employee);
        return flag;
    });
    System.out.println(b);
}

这个大概懂了,就是不知道为什么那个 m 参数是 id集合中的当前id,而不是一个 Employee集合。

然后就是传入 wrapper 条件构造器之后,为什么就直接会有一个 id集合返回---  哈哈哈 我还是个学生,问题就是多哦,,老师?

1 回复 有任何疑惑可以回复我~
#1

老猿

其实我也不理解,按常理来说,m参数应该是实体类,而实际测试结果它是主键。我也很费解作者为什么这么设计。
2019-12-26 回复 有任何疑惑可以回复我~
#2

想好好学习的懒人 提问者

谢谢指导
2019-12-27 回复 有任何疑惑可以回复我~
#3

amllng 回复 老猿

真搞不懂,返回主键是搞什么,如果想要对应实体的其他属性,难道真的要在里边再查询一遍数据库,然后取相应的值吗,那我还不如自己写sql去实现,还减少查询。
2020-04-02 回复 有任何疑惑可以回复我~
#4

a12345531

selectObjs(queryWrapper) 只返回第一个字段的值,所以后面mapper只能拿到第一个字段的值
2022-07-14 回复 有任何疑惑可以回复我~
查看1条回复

能举个栗子不..

0 回复 有任何疑惑可以回复我~

就是后面的那个函数式接口不会传参?对8的特性理解不够

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

其中的方法的使用

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信