我可以装饰番石榴的细木工班吗?

2022-09-04 06:11:20

我有一个,我们正在使用Joiner来获得该列表的逗号分隔表示形式,但现在我们需要做一些增强,我们需要将列表中的值大写。现在的代码是——List<String>

String str = Joiner.on(',').skipNulls().join(myValueList);

但是现在,由于我需要将值中存在的字符串大写,我需要首先迭代它以大写,然后传递给Joiner进行连接,但我不认为这是一个好方法,因为它会迭代列表两次,一次是大写,然后Joiner将迭代为Join。
我是否缺少任何其他实用程序方法,可以在一次迭代中执行此操作。

你会如何用番石榴做到这一点?


答案 1

您可以使用 Iterables.transform()

Iterable<String> upperStrings = Iterables.transform(myValueList, new Function<String,String>() {
  public String apply(String input) {
    // any transformation possible here.
    return (input == null) ? null : input.toUpperCase();
  }
});
Str str = Joiner.on(',').skipNulls().join(upperStrings);

答案 2

关于Joachim Sauer的答案:

如果您将函数移动到可以重用它的地方,则可以使其不那么冗长,在Guava中,典型的情况是使用枚举:

public enum StringTransformations implements Function<String, String>{
    LOWERCASE{

        @Override
        protected String process(final String input){
            return input.toLowerCase();
        }
    },
    UPPERCASE{
        @Override
        protected String process(final String input){
            return input.toUpperCase();
        }
    }
    // possibly more transformations here
    ;

    @Override
    public String apply(final String input){
        return input == null ? null : process(input);
    }

    protected abstract String process(String input);

}

现在客户端代码如下所示:

String str =
    Joiner
        .on(',')
        .skipNulls()
        .join(
            Iterables.transform(myValueList,
                StringTransformations.UPPERCASE));

我认为这更具可读性。

当然,如果您为 Joiner 引入一个常量,它会更好(在内存使用和性能方面):

private static final Joiner COMMA_JOINER = Joiner.on(',').skipNulls();

// ...

String str = COMMA_JOINER.join(
            Iterables.transform(myValueList,
                StringTransformations.UPPERCASE));

推荐