Pārlūkot izejas kodu

添加 distinct 函数(lambda)

kangjie 5 gadi atpakaļ
vecāks
revīzija
e0ec534277

+ 2 - 2
src/main/java/org/ssssssss/magicapi/expression/ExpressionEngine.java

@@ -20,12 +20,12 @@ public class ExpressionEngine {
 		list.add("987654321");
 		list.add("yyy");
 		list.add("");
+		list.add("yyy");
 		params.put("list", list);
 		params.put("test", new TestClass());
 		params.put("cc", null);
 
-
-		Object result = engine.execute("${test.test(cc)}", params);
+		Object result = engine.execute("${list.distinct(cc->cc)}", params);
 		System.out.println(result);
 
 	}

+ 23 - 0
src/main/java/org/ssssssss/magicapi/expression/parsing/ArrayLikeLambdaExecutor.java

@@ -21,6 +21,7 @@ public class ArrayLikeLambdaExecutor {
         addSupport(temp, set, "sort");
         addSupport(temp, set, "every");
         addSupport(temp, set, "some");
+        addSupport(temp, set, "distinct");
         SUPPORT_METHOD = Collections.unmodifiableSet(set);
         METHODS = Collections.unmodifiableMap(temp);
     }
@@ -153,6 +154,28 @@ public class ArrayLikeLambdaExecutor {
         return toOriginType(arrayLike, results);
     }
 
+    @SuppressWarnings("unchecked")
+    public static Object distinct(Object arrayLike, Object... arguments) {
+        MultipleArgumentsLambda mal = (MultipleArgumentsLambda) arguments[0];
+        Function<Object[], Object> handler = mal.getHandler();
+        List<Object> coll = arrayLikeToList(arrayLike);
+        List<Object> args = new ArrayList<>(2);
+        Map<Object, Object> map = new LinkedHashMap<>(coll.size());
+        for (int i = 0; i < coll.size(); i++) {
+            Object obj = coll.get(i);
+            args.clear();
+            args.add(obj);
+            if (mal.getArgs().size() > 1) {
+                args.add(i);
+            }
+            Object result = handler.apply(args.toArray());
+            if (!map.containsKey(result)) {
+                map.put(result, obj);
+            }
+        }
+        return toOriginType(arrayLike, new ArrayList<>(map.values()));
+    }
+
 
     @SuppressWarnings("unchecked")
     public static Object every(Object arrayLike, Object... arguments) {