循环中未使用的变量

时间:2013-10-21 04:04:47

标签: java loops foreach

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

我的代码是:

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

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

对此有何改进?

我希望像:

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

但显然没有..

7 个答案:

答案 0 :(得分:2)

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

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

IntelliJ仍然抱怨,但是:)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以使用for each loop

for (String s : args)

或者您可以在条件中使用班级for loop

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

但不管怎样,有一个“未使用”的变量,除了实际上未使用;它被用作for loop中的计数条件。只有那两种for loop样式。

要回答您的问题,没有“改进”,尽管不需要“改进”。

答案 3 :(得分: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循环(正如您所说的那么简明),请改用while

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

另请参阅When to use StringBuilder?

  

当你在循环中连接时 - 通常是编译器不能单独替换StringBuilder时。

答案 4 :(得分:0)

如果您有Guava,可以尝试将JoinerCollections.nCopies合并:

Joiner.on(", ").join(Collections.nCopies(args.size(), "?"));

答案 5 :(得分:0)

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

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

为了便于比较,整个事情可以用Groovy和许多其他语言来解决,例如args.collect{'?'}.join(',')。在Java中,使用我提到的实用程序,更像是:

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

相当不太可读......

答案 6 :(得分:0)

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

String output = args
            .stream()
            .map( string -> "?" ) // transform each string into a ?
            .collect( Collectors.joining( "," ) ); // collect and join on ,