在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中实现这一点的最佳方法是什么?

推荐答案

Java 8之前:

Apache的Commons Lang在这里是您的朋友-它提供了一个非常类似于您在Ruby中引用的连接方法:

StringUtils.join(java.lang.Iterable,char)


Java 8:

Java8通过StringJoinerString.join()提供了开箱即用的连接.下面的代码片段展示了如何使用它们:

StringJoiner

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"

Java相关问答推荐

scanner 如何在执行hasNextLine一次后重新读取整个文件?

方法没有用正确的值填充数组—而是将数组保留为null,'

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

Jooq外键关系

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

如何调整工作时间日历中的时间

当涉及到泛型时,类型推理在Java中是如何工作的?

如何正确创建序列图?

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

Java构造函数分支

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

为什么Collectors.toList()不能保证易变性

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

舰队运行配置Maven版本

未调用OnBackPressedCallback-Activitiy立即终止

JPA无手术同品种器械可能吗?

如何以事务方式向ibmmq发送消息

Java方法参数:括号中的类型声明?

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?