package com.baomidou.mybatisplus.extension.toolkit; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; /** * simple-query 让简单的查询更简单 * * @author * @since 2021/11/9 18:27 */ public class SimpleQuery { private SimpleQuery() { /* Do not new me! */ } /** * 通过lambda获取Class * * @param sFunction 可序列化的lambda * @param Class类型 * @return 对应的Class */ @SuppressWarnings("unchecked") public static Class getType(SFunction sFunction) { return (Class) LambdaUtils.extract(sFunction).getInstantiatedClass(); } /** * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map * * @param wrapper 条件构造器 * @param sFunction key * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 * @param 实体类型 * @param 实体中的属性类型 * @return Map<实体中的属性, 实体> */ @SafeVarargs public static Map keyMap(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { return list2Map(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, Function.identity(), peeks); } /** * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map * * @param wrapper 条件构造器 * @param keyFunc key * @param valueFunc value * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 * @param 实体类型 * @param 实体中的属性类型 * @param

实体中的属性类型 * @return Map<实体中的属性, 实体> */ @SafeVarargs public static Map map(LambdaQueryWrapper wrapper, SFunction keyFunc, SFunction valueFunc, Consumer... peeks) { return list2Map(SqlHelper.getMapper(getType(keyFunc)).selectList(wrapper), keyFunc, valueFunc, peeks); } /** * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map * * @param wrapper 条件构造器 * @param sFunction 分组依据 * @param peeks 后续操作 * @param 实体类型 * @param 实体中的属性类型 * @return Map<实体中的属性, List < 实体>> */ @SafeVarargs public static Map> group(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); } /** * 传入wrappers和需要的某一列,从数据中根据条件查询出对应的列,转换成list * * @param wrapper 条件构造器 * @param sFunction 需要的列 * @param peeks 后续操作 * @return java.util.List * @author * @since 2021/11/9 17:59 */ @SafeVarargs public static List list(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { return list2List(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); } /** * 对list进行map、peek操作 * * @param list 数据 * @param sFunction 需要的列 * @param peeks 后续操作 * @return java.util.List * @author * @since 2021/11/9 18:01 */ @SafeVarargs public static List list2List(List list, SFunction sFunction, Consumer... peeks) { return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).map(sFunction).collect(Collectors.toList()); } /** * 对list进行groupBy操作 * * @param list 数据 * @param sFunction 分组的key,依据 * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 * @param 实体类型 * @param 实体中的属性类型 * @return Map<实体中的属性, List < 实体>> */ @SafeVarargs public static Map> listGroupBy(List list, SFunction sFunction, Consumer... peeks) { return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(HashMap::new, (m, v) -> { A key = Optional.ofNullable(v).map(sFunction).orElse(null); List values = m.getOrDefault(key, new ArrayList<>(list.size())); values.add(v); m.put(key, values); }, (totalMap, nowMap) -> nowMap.forEach((k, v) -> { List values = totalMap.getOrDefault(k, new ArrayList<>(list.size())); values.addAll(v); totalMap.put(k, values); })); } /** * list转换为map * * @param 实体类型 * @param 实体中的属性类型 * @param

实体中的属性类型 * @param list 数据 * @param keyFunc key * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 * @return Map<实体中的属性, 实体> */ @SafeVarargs public static Map list2Map(List list, SFunction keyFunc, Function valueFunc, Consumer... peeks) { return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(HashMap::new, (m, v) -> m.put(keyFunc.apply(v), valueFunc.apply(v)), HashMap::putAll); } }