### Question:
Functions { public static String join(String[] values, String separator) { return values != null ? StringUtil.join(separator, (Object[]) values) : null; } private  Functions(); static String[] array(String... values); static boolean contains(Object object, Object value); static int indexOf(String value, String substring); static String join(String[] values, String separator); static String keyMatch(Object map, String pattern); static int length(Object value); static boolean matches(String value, String pattern); static String[] matchingGroups(String value, String pattern); static String[] split(String value, String regex); static String toLowerCase(String value); static String toString(Object value); static String toUpperCase(String value); static String trim(String value); static String urlEncode(String value); static String urlDecode(String value); static String encodeBase64(final String value); static String decodeBase64(final String value); static String read(final String filename); static Properties readProperties(final String filename);  }### Answer:
@Test public void join() throws ExpressionException { String[] s = {"a", "b", "c"}; attributes.put("foo", s); String o = Expression.valueOf("${join(attributes.foo, ',')}", String.class).eval(bindings); assertThat(o).isEqualTo("a,b,c"); }