org.apache.shardingsphere.core.util.InlineExpressionParser
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.7</version>
<classifier>indy</classifier>
</dependency>
@Test
public void groovyTest() {
GroovyShell groovyShell = new GroovyShell();
Object evaluate = groovyShell.evaluate("[1..12]");
System.out.println(evaluate);
Script parse = groovyShell.parse("(1..12).collect {t -> t.toString().padLeft(2,'0')}");
Object run = parse.run();
System.out.println(run);
IntRange integers = new IntRange(1,12);
Iterator<Integer> toInt = integers.iterator();
while (toInt.hasNext()) {
System.out.println(toInt.next());
}
}
private List<String> flatten(final List<Object> segments) {
List<String> result = new ArrayList<>();
for (Object each : segments) {
if (each instanceof GString) {
result.addAll(assemblyCartesianSegments((GString) each));
} else {
result.add(each.toString());
}
}
return result;
}
private List<String> assemblyCartesianSegments(final GString segment) {
Set<List<String>> cartesianValues = getCartesianValues(segment);
List<String> result = new ArrayList<>(cartesianValues.size());
for (List<String> each : cartesianValues) {
result.add(assemblySegment(each, segment));
}
return result;
}
private Set<List<String>> getCartesianValues(final GString segment) {
List<Set<String>> result = new ArrayList<>(segment.getValues().length);
for (Object each : segment.getValues()) {
if (null == each) {
continue;
}
if (each instanceof Collection) {
result.add(Sets.newLinkedHashSet(Collections2.transform((Collection<Object>) each, new Function<Object, String>() {
@Override
public String apply(final Object input) {
return input.toString();
}
})));
} else {
result.add(Sets.newHashSet(each.toString()));
}
}
return Sets.cartesianProduct(result);
}
private String assemblySegment(final List<String> cartesianValue, final GString segment) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < segment.getStrings().length; i++) {
result.append(segment.getStrings()[i]);
if (i < cartesianValue.size()) {
result.append(cartesianValue.get(i));
}
}
return result.toString();
}
groovyShell的evaluate和parse的区别是,parse会提前编译为Script进行缓存,执行run方法才开始解析。而evaluate是直接解析出结果。