最近、Java アプリで作業しているときに、要素数が事前にわからないまま、別の Web サービスに渡すコンマ区切りの値リストを作成する必要がありました。頭に浮かんだ最良の方法は、次のようなものでした。
public String appendWithDelimiter( String original, String addition, String delimiter ) {
if ( original.equals( "" ) ) {
return addition;
} else {
return original + delimiter + addition;
}
}
String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );
文字列があちこちに作成されるため、これは特に効率的ではないことは承知していますが、最適化よりも明確さを重視しました。
Ruby では、代わりに次のようにすることができ、よりエレガントに感じられます。
parameterArray = [];
parameterArray << "elementName" if condition;
parameterArray << "anotherElementName" if anotherCondition;
parameterString = parameterArray.join(",");
しかし、Java には join コマンドがないため、同等のものを思いつくことができませんでした。
では、Java でこれを行う最善の方法は何でしょうか?
ベストアンサー1
Java 8以前:
ここでは Apache の commons lang が役に立ちます。これは、Ruby で参照する join メソッドと非常によく似た join メソッドを提供します。
StringUtils.join(java.lang.Iterable,char)
Java8:
StringJoiner
Java 8 では、 とを介してすぐに使用できる結合機能が提供されていますString.join()
。以下のスニペットは、それらの使用方法を示しています。
StringJoiner joiner = new StringJoiner(",");
joiner.add("01").add("02").add("03");
String joinedString = joiner.toString(); // "01,02,03"
String.join(CharSequence delimiter, CharSequence... elements))
String joinedString = String.join(" - ", "04", "05", "06"); // "04 - 05 - 06"
String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
List<String> strings = new LinkedList<>();
strings.add("Java");strings.add("is");
strings.add("cool");
String message = String.join(" ", strings);
//message returned is: "Java is cool"