如何将字符串列表格式化为

How to format a list of strings into

我有一个字符串列表,我想以相同的方式对每个字符串进行格式化。例如myListOfStrings = str1, str2, str3,我的格式是 (%s) 我想要这样的东西:

String.format(" (%s) ", myListOfStrings)

会输出

(str1)  (str2)  (str3)

有没有一种优雅的方式来做到这一点?还是我必须使用字符串生成器并对所有字符串执行 foreach 循环?

String strOut = "";
for(int i=0; i< myListOfStrings.size(); i++){
    strOut = strOut +"("+myListOfStrings.get(i)+")";
}

你可以用 Java 8:

import static java.util.stream.Collectors.joining;

public static void main(String[] args) throws Exception {

    final List<String> strings = Arrays.asList("a", "b", "c");

    final String joined = strings.stream()
            .collect(joining(") (", "(", ")"));

    System.out.println(joined);
}

或:

final String joined = strings.stream()
        .map(item -> "(" + item + ")")
        .collect(joining(" "));

你更喜欢哪一个是个人喜好问题。

第一个加入 ) ( 上的项目,给出:

a) (b) (c

然后使用 joining 的前缀和后缀参数,前缀为 (,后缀为 ),以产生正确的结果。

第二种选择将每个项目转换为 ( + item + ),然后将它们加入“ ”。

第一个也可能稍微快一些,因为它只需要为连接和 pre/suffix 创建 一个 StringBuilder 实例。第二种选择需要创建 n + 1 StringBuilder 个实例,一个用于每个元素,一个用于连接 " "。

你可以试试这个:

List<String> list = new ArrayList<String>();
list.add("str1");
list.add("str2");
list.add("str3");

for(String s : list) {
  System.out.println(String.format(" (%s) ", s));
}

如果您想要一个单行解决方案,您可以使用 Apache Commons Lang 中的 StringUtils.join 方法之一。

String result = "(" + StringUtils.join(myListOfStrings, ") (") + ")";

使用 Java8 新的 forEach 方法遍历集合:

public static String format(List<String> list) {
    StringBuilder sb = new StringBuilder();
    list.forEach(x -> sb.append(String.format(" (%s) ", x)));
    return sb.toString();
} 

在这里试试:https://ideone.com/52EKRH

Boris The Spider 的回答是我愿意接受的,但如果你没有使用 java 8,但也许你正在使用 Guava,你可以这样做,尽管它有点冗长:

Joiner.on("").join(Collections2.transform(myListOfStrings, new Function<String, String>() {

        @Override
        public String apply(String input) {
            return String.format(" (%s) ", input);
        }
    }));