@Override
    public ConcatStep<S> clone() {
        final ConcatStep<S> clone = (ConcatStep<S>) super.clone();
        if (null != this.concatTraversals) {
            clone.concatTraversals = new ArrayList<>();
            for (final Traversal.Admin<S, String> concatTraversals : this.concatTraversals) {
                clone.concatTraversals.add(concatTraversals.clone());
            }
        }
        if (null != this.concatStrings) {
            clone.concatStrings = new ArrayList<>();
            clone.concatStrings.addAll(this.concatStrings);
        }
        return clone;
    }
Reference implementation for String concatenation step, a mid-traversal step which concatenates one or more
String values together to the incoming String traverser. If the incoming traverser is a non-String value then an
{@code IllegalArgumentException} will be thrown.

@author Yang Xia (http://github.com/xiazcy)
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ConcatStep.java