有没有一种方法可以将字符串连接起来,并且每个字符串都有一个特定的包围字符串?

6
我想使用guava的JoinerList<String>连接成一个字符串,并在列表中的每个字符串周围添加字符串。因此,我想要获取一个字符串列表:
List<String> names = Arrays.asList("John", "Mary", "Henry");

并生成这一个字符串:

"your guest John is here, your guest Mary is here, your guest Henry is here"

我看到的使用 Joiner 的示例似乎是生成由逗号分隔的 3 个名称,但我想要在每个字符串周围包含一些额外字符串(每次都相同)。
希望我表达得足够清楚。谢谢您的帮助。

你不能只用 Joiner 来实现这个。Joiner 只能在元素之间添加内容,而不能在它们周围添加内容。 - Sotirios Delimanolis
请查看此链接:https://dev59.com/ynrZa4cB1Zd3GeqP9PXx,其中有更详细的解释。 - Mohammad Adnan
3个回答

15

首先,实现这个方法的方式是使用一个变换:

 Joiner.on(", ").join(Iterables.transform(names, new Function<String, String>() {
   public String apply(String str) { return "your guest " + str + " is here"; }
 }));

7
太赞了,函数式编程! - Sotirios Delimanolis
2
而且在Java 8中,`names.stream().map(name -> "你的客人 " + name + " 在这里").collect(Collectors.joining(", "))。 - Chthonic Project

4
如何处理呢?
    String str = "your guest " + Joiner.on(" is here, your guest ").join(names) + " is here";

1
我的猜测是Natix指的是文本的一部分被硬编码了两次。 - Rhand

0
如果Joiner不是必须的,你可以使用String.format()
public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Mary", "Henry");
        StringBuilder builder = new StringBuilder();

        for(int i=0; i<names.size();i++){
            builder.append(String.format("your guest %s is here, ", names.get(i)));
        }
        System.out.println(builder.substring(0,builder.length()-2).toString());
    }

1
Joiner 的整个目的就是避免这样的解决方案,所以不需要使用 +0。此外,在循环中不应该连接 result,而是将其新部分附加到 StringBuilder 中。 - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接