SimpleQuery.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package com.baomidou.mybatisplus.extension.toolkit;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
  4. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  5. import java.util.*;
  6. import java.util.function.Consumer;
  7. import java.util.function.Function;
  8. import java.util.stream.Collectors;
  9. import java.util.stream.Stream;
  10. /**
  11. * simple-query 让简单的查询更简单
  12. *
  13. * @author <achao1441470436@gmail.com>
  14. * @since 2021/11/9 18:27
  15. */
  16. public class SimpleQuery {
  17. private SimpleQuery() {
  18. /* Do not new me! */
  19. }
  20. /**
  21. * 通过lambda获取Class
  22. *
  23. * @param sFunction 可序列化的lambda
  24. * @param <E> Class类型
  25. * @return 对应的Class
  26. */
  27. @SuppressWarnings("unchecked")
  28. public static <E> Class<E> getType(SFunction<E, ?> sFunction) {
  29. return (Class<E>) LambdaUtils.extract(sFunction).getInstantiatedClass();
  30. }
  31. /**
  32. * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map
  33. *
  34. * @param wrapper 条件构造器
  35. * @param sFunction key
  36. * @param peeks 封装成map时可能需要的后续操作,不需要可以不传
  37. * @param <E> 实体类型
  38. * @param <A> 实体中的属性类型
  39. * @return Map<实体中的属性, 实体>
  40. */
  41. @SafeVarargs
  42. public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
  43. return list2Map(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, Function.identity(), peeks);
  44. }
  45. /**
  46. * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map
  47. *
  48. * @param wrapper 条件构造器
  49. * @param keyFunc key
  50. * @param valueFunc value
  51. * @param peeks 封装成map时可能需要的后续操作,不需要可以不传
  52. * @param <E> 实体类型
  53. * @param <A> 实体中的属性类型
  54. * @param <P> 实体中的属性类型
  55. * @return Map<实体中的属性, 实体>
  56. */
  57. @SafeVarargs
  58. public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, Consumer<E>... peeks) {
  59. return list2Map(SqlHelper.getMapper(getType(keyFunc)).selectList(wrapper), keyFunc, valueFunc, peeks);
  60. }
  61. /**
  62. * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map
  63. *
  64. * @param wrapper 条件构造器
  65. * @param sFunction 分组依据
  66. * @param peeks 后续操作
  67. * @param <E> 实体类型
  68. * @param <A> 实体中的属性类型
  69. * @return Map<实体中的属性, List < 实体>>
  70. */
  71. @SafeVarargs
  72. public static <E, A> Map<A, List<E>> group(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
  73. return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks);
  74. }
  75. /**
  76. * 传入wrappers和需要的某一列,从数据中根据条件查询出对应的列,转换成list
  77. *
  78. * @param wrapper 条件构造器
  79. * @param sFunction 需要的列
  80. * @param peeks 后续操作
  81. * @return java.util.List<A>
  82. * @author <achao1441470436@gmail.com>
  83. * @since 2021/11/9 17:59
  84. */
  85. @SafeVarargs
  86. public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
  87. return list2List(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks);
  88. }
  89. /**
  90. * 对list进行map、peek操作
  91. *
  92. * @param list 数据
  93. * @param sFunction 需要的列
  94. * @param peeks 后续操作
  95. * @return java.util.List<A>
  96. * @author <achao1441470436@gmail.com>
  97. * @since 2021/11/9 18:01
  98. */
  99. @SafeVarargs
  100. public static <A, E> List<A> list2List(List<E> list, SFunction<E, A> sFunction, Consumer<E>... peeks) {
  101. return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).map(sFunction).collect(Collectors.toList());
  102. }
  103. /**
  104. * 对list进行groupBy操作
  105. *
  106. * @param list 数据
  107. * @param sFunction 分组的key,依据
  108. * @param peeks 封装成map时可能需要的后续操作,不需要可以不传
  109. * @param <E> 实体类型
  110. * @param <A> 实体中的属性类型
  111. * @return Map<实体中的属性, List < 实体>>
  112. */
  113. @SafeVarargs
  114. public static <A, E> Map<A, List<E>> listGroupBy(List<E> list, SFunction<E, A> sFunction, Consumer<E>... peeks) {
  115. return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(HashMap::new, (m, v) -> {
  116. A key = Optional.ofNullable(v).map(sFunction).orElse(null);
  117. List<E> values = m.getOrDefault(key, new ArrayList<>(list.size()));
  118. values.add(v);
  119. m.put(key, values);
  120. }, (totalMap, nowMap) -> nowMap.forEach((k, v) -> {
  121. List<E> values = totalMap.getOrDefault(k, new ArrayList<>(list.size()));
  122. values.addAll(v);
  123. totalMap.put(k, values);
  124. }));
  125. }
  126. /**
  127. * list转换为map
  128. *
  129. * @param <E> 实体类型
  130. * @param <A> 实体中的属性类型
  131. * @param <P> 实体中的属性类型
  132. * @param list 数据
  133. * @param keyFunc key
  134. * @param peeks 封装成map时可能需要的后续操作,不需要可以不传
  135. * @return Map<实体中的属性, 实体>
  136. */
  137. @SafeVarargs
  138. public static <E, A, P> Map<A, P> list2Map(List<E> list, SFunction<E, A> keyFunc, Function<E, P> valueFunc, Consumer<E>... peeks) {
  139. 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);
  140. }
  141. }