2

我需要根据参数列表构建模式字符串。如果参数是"foo", "bar", "data",那么模式应该是:"?, ?, ?"

我的代码是:

List<String> args;
...
for(String s : args) {
  pattern += "?,";
}
pattern = pattern.substring(0, pattern.length()-1);

它工作正常,唯一担心的是,s没有使用,似乎代码有点脏。

对此有何改进?

我希望是这样的:

for(args.size()) {
    ...
}

但是貌似没有..

4

7 回答 7

2

您可以使用for loop具有条件的类:

for (int i = 0, s < args.size(); i++)

在这种情况下,i正被用作计数变量。

除此之外,没有任何改进需要改进,尽管不需要改进。

于 2013-10-21T04:13:20.750 回答
2

我通常用 Haskell / Python 风格来做——用“_”命名。这样,很明显变量是故意未使用的:

int n = 0;
for (final Object _ : iterable) { ++n; }

不过,IntelliJ 仍然在抱怨 :)

于 2015-09-30T09:12:36.750 回答
1

另一种选择是使用 Java Stream 的 api。这很整洁。

String output = args
            .stream()
            .map( string -> "?" ) // transform each string into a ?
            .collect( Collectors.joining( "," ) ); // collect and join on ,
于 2019-07-26T15:14:08.330 回答
0

您正在寻找的是一个称为“加入”的概念。在像 Groovy 这样更强大的语言中,它在标准库中可用,并且您可以编写,例如args.join(',')获得您想要的东西。StringUtils.join(args, ",")使用 Java,您可以从Commons Lang(一个应该包含在任何地方的每个 Java 项目中的库)中获得类似的效果。

更新:我显然错过了原始答案的重要部分。字符串列表需要先变成问号。Commons Collections 是另一个应该始终包含在 Java 应用程序中的库,它允许您使用. 然后将结果传递给我最初提到的连接。当然,这在 Java 中变得有点笨拙,更命令式的方法可能更合适。CollectionUtils.transform(args,new ConstantTransformer<String, String>("?"))

为了比较起见,整个事情都可以用 Groovy 和许多其他语言用类似args.collect{'?'}.join(','). 在 Java 中,使用我提到的实用程序,这更像是:

StringUtils.join(
    CollectionUtils.transform(args, 
                              new ConstantTransformer<String, String>("?")),
    ",");

可读性差很多……

于 2013-10-21T05:19:09.987 回答
0

如果你身边有 Guava,你可以尝试将JoinerCollections.nCopies结合使用:

Joiner.on(", ").join(Collections.nCopies(args.size(), "?"));
于 2013-10-21T04:58:05.713 回答
0

为什么不使用 for (int i = 0; i < args.size(); i++) { ... }

如果你想利用你迭代的任何内容,你可以使用 for each 块。例如,for (String s : args)如果您知道要使用 args 中存在的每个字符串值,则使用。看起来在这里,您不需要实际的字符串。

于 2013-10-21T04:08:13.033 回答
0

我建议在这里StringBuilder与经典for循环一起使用。

String pattern = "";
if (args.size() > 0) {
    StringBuilder sb = new StringBuilder("?");
    for(int i = 1; i < args.size(); i++) {
        sb.append(", ?");
    }
    pattern = sb.toString();
}


如果您不想使用for循环(正如您所说的不够简洁),请使用 awhile代替:

int count;
String pattern = "";
if ((count = args.size()) > 0) {
    StringBuilder sb = new StringBuilder("?");
    while (count-- > 1) {
        sb.append(", ?");
    }
    pattern = sb.toString();
}

另请参阅何时使用 StringBuilder?

在您在循环中进行连接的时候 - 这通常是编译器无法自行替换 StringBuilder 的时候。

于 2013-10-21T04:19:41.463 回答