【问题标题】:Guava Joiner doesn't have ability to prefix and suffix [duplicate]Guava Joiner 没有前缀和后缀的能力[重复]
【发布时间】:2014-01-06 08:07:18
【问题描述】:

我在 Joiner 中要求能够为元素添加前缀和后缀。

例如

String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);

预期的输出是:

'a','b','c'

我们有其他选择吗?由于番石榴不这样做(或者我不知道)。使用 java 8 是否有更好的选择?

【问题讨论】:

    标签: java google-api guava


    【解决方案1】:

    您可以使用 Guava 的 List#transform 进行转换 a --> 'a' ,然后在转换后的列表上使用 Joinertransform 仅适用于 Iterable 对象,但不适用于数组。代码仍然足够简洁:

    List<String> strList = Lists.newArraylist(str); // where str is your String[]
    Joiner.on(',').join(Lists.transform(str, surroundWithSingleQuotes));
    

    其中变换如下:

    Function<String, String> surroundWithSingleQuotes = new Function<String, String>() {
        public String apply(String string) {
            return "'" + string + "'";
        }
    };
    

    有人可能会说这是一种冗长的做法,但我很欣赏transform 范式提供的灵活性。

    编辑(因为现在有 Java 8)

    在 Java 8 中,所有这些都可以使用 Stream 接口在一行中完成,如下所示:

    strList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));
    

    【讨论】:

    • 我喜欢它。接受的答案分崩离析,因为它不是真正的装饰器;例如,如果您想要根据某些条件使用不同的周围字符串,则 transform() 方法会更直接
    • 接受这个答案。
    • @MohdAdnan :如果您从数组而不是列表开始,您可以直接使用Arrays.stream(str_array) 而不是先将其转换为列表。其余的mapcollect 步骤保持不变。
    【解决方案2】:

    更有效的解决方案是

    String str[] = {"a", "b", "c"}; // or whatever
    if (str.length == 0 ) {
        return "";
    }
    return "'" + Joiner.on("','").join(str) + "'";
    

    这也比使用 Function 更短(至少没有函数文字;空输入的处理使这个解决方案变得丑陋)。不好的部分是您必须以一种不太明显的方式在Joiner 中包含前缀和后缀并重复它们。这个例子更明显:

    return "[" + Joiner.on("], [").join(str) + "]";
    

    要想不假思索地做对,只需记住 ["+", "+"] 的结果,即 [+], [+] 并使用加号分隔的部分。

    【讨论】:

    • 这个方法会很好用,除非你有空数组要加入。因此,如果数组为空,我们可能需要处理不要加入它们。我刚刚添加了如果检查。
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2017-09-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多