瀏覽代碼

!198 优化SimpleQuery,处理了值为空的情况,太牛了
Merge pull request !198 from 阿超/3.0

青苗 3 年之前
父節點
當前提交
ababc65219

+ 12 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java

@@ -4,8 +4,7 @@ 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.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -124,7 +123,16 @@ public class SimpleQuery {
      */
     @SafeVarargs
     public static <A, E> Map<A, List<E>> listGroupBy(List<E> list, SFunction<E, A> sFunction, Consumer<E>... peeks) {
-        return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(Collectors.groupingBy(sFunction));
+        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<E> values = m.getOrDefault(key, new ArrayList<>(list.size()));
+            values.add(v);
+            m.put(key, values);
+        }, (totalMap, nowMap) -> nowMap.forEach((k, v) -> {
+            List<E> values = totalMap.getOrDefault(k, new ArrayList<>(list.size()));
+            values.addAll(v);
+            totalMap.put(k, values);
+        }));
     }
 
 
@@ -141,7 +149,7 @@ public class SimpleQuery {
      */
     @SafeVarargs
     public static <E, A, P> Map<A, P> list2Map(List<E> list, SFunction<E, A> keyFunc, Function<E, P> valueFunc, Consumer<E>... peeks) {
-        return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(Collectors.toMap(keyFunc, valueFunc, (l, r) -> l));
+        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);
     }
 
 

+ 5 - 9
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/SimpleQueryTest.java

@@ -29,7 +29,7 @@ public class SimpleQueryTest extends BaseDbTest<EntityMapper> {
         // 可叠加后续操作
         List<String> names = SimpleQuery.list(Wrappers.lambdaQuery(), Entity::getName, e -> Optional.ofNullable(e.getName()).map(String::toUpperCase).ifPresent(e::setName));
 
-        Assert.isTrue(names.equals(Arrays.asList("RUBEN", "A CHAO")), "Ops!");
+        Assert.isTrue(names.equals(Arrays.asList("RUBEN", null)), "Ops!");
     }
 
     @Test
@@ -47,12 +47,8 @@ public class SimpleQueryTest extends BaseDbTest<EntityMapper> {
         // 校验结果
         Map<Long, String> map = new HashMap<>(1 << 2);
         map.put(1L, "ruben");
-        map.put(2L, "a chao");
+        map.put(2L, null);
         Assert.isTrue(idNameMap.equals(map), "Ops!");
-
-        // 同样支持叠加后续操作
-//        SimpleQuery.keyMap(Wrappers.lambdaQuery(), Entity::getId, System.out::println, System.out::println);
-
     }
 
     @Test
@@ -71,8 +67,8 @@ public class SimpleQueryTest extends BaseDbTest<EntityMapper> {
         Map<String, List<Entity>> map = new HashMap<>(1 << 2);
         Entity chao = new Entity();
         chao.setId(2L);
-        chao.setName("a chao");
-        map.put("a chao", Collections.singletonList(chao));
+        chao.setName(null);
+        map.put(null, Collections.singletonList(chao));
 
         Entity ruben = new Entity();
         ruben.setId(1L);
@@ -87,7 +83,7 @@ public class SimpleQueryTest extends BaseDbTest<EntityMapper> {
 
     @Override
     protected String tableDataSql() {
-        return "insert into entity(id,name) values(1,'ruben'),(2,'a chao');";
+        return "insert into entity(id,name) values(1,'ruben'),(2,null);";
     }
 
     @Override