/* * Copyright 2014 mango.jfaster.org * * The Mango Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.jfaster.mango.util; import javax.annotation.Nullable; import java.util.Iterator; /** * @author ash */ public class Joiner { public static Joiner on(String separator) { return new Joiner(separator); } public static Joiner on(char separator) { return new Joiner(String.valueOf(separator)); } private final String separator; private Joiner(String separator) { if (separator == null) { throw new NullPointerException(); } this.separator = separator; } private Joiner(Joiner prototype) { this.separator = prototype.separator; } public final String join(Iterable<?> parts) { return join(parts.iterator()); } public final String join(Iterator<?> parts) { return appendTo(new StringBuilder(), parts).toString(); } public StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) { if (parts.hasNext()) { builder.append(toString(parts.next())); while (parts.hasNext()) { builder.append(separator); builder.append(toString(parts.next())); } } return builder; } public Joiner useForNull(final String nullText) { if (nullText == null) { throw new NullPointerException(); } return new Joiner(this) { @Override CharSequence toString(@Nullable Object part) { return (part == null) ? nullText : Joiner.this.toString(part); } @Override public Joiner useForNull(String nullText) { throw new UnsupportedOperationException("already specified useForNull"); } }; } CharSequence toString(Object part) { if (part == null) { throw new NullPointerException(); } return (part instanceof CharSequence) ? (CharSequence) part : part.toString(); } }