通过Java中的for-each循环检测第一次迭代

我正在使用一个服务器,它将字符分隔列表返回给它的客户端。 为了构建这些列表,我必须通过for-each循环检测第一次迭代:

StringBuilder builder = new StringBuilder() ; boolean firstIterationFlag = true ; for ( String s : list ){ if ( firstIterationFlag) { firstIterationFlag = false ; } else { builder.append(separator); } builder.append(s) ; } return builder.toString() ; 

没有国旗,有没有办法做到这一点?

对于这种情况,一种更简单的方法是注意你总是可以附加一个空字符串:

 // For the first iteration, use a no-op separator String currentSeparator = ""; for (String s : list) { builder.append(currentSeparator); builder.append(s); // From the second iteration onwards, use this currentSeparator = separator; } 

或者(并且最好)使用Guava的Joiner类开始:)

这个“木匠”场景几乎总是给出了这个要求 – 所以只需使用Joiner 。 对于其他方案,请使用常规for循环或根据您的代码使用条件。

不使用foreach,而是手动使用迭代器:

 Iterator it = list.iterator(); if(it.hasNext()){ doSomeThingForTheFirstTime(it.next()); while(it.hasNext()){ doSomethingElse(it.next); } } 

(顺便说一句,这几乎是Guava的Joiner课程在内部所做的,尽管在更高的层次上)

在你引用的特定情况下,使用Guava的Joiner而不是自己滚动……

用分隔符连接文本(指定为数组,Iterable,varargs甚至Map)的对象。 它将结果附加到Appendable或将它们作为String返回。 例:

 Joiner joiner = Joiner.on(separator).skipNulls(); return joiner.join(list); 

Java 8解决方案

如果你有Java 8可用,你可以简单地使用String#join ,不需要Guava:

 String.join(", ", list) 

只是为了这里的乐趣是一个不同的选择。

  StringBuilder builder = new StringBuilder(); for (String s : list) { builder.append(separator); builder.append(s); } builder.deleteCharAt(0); return builder.toString(); 

你可以尝试这个:)

 int i = 0; for (something : manythings) { i++; } 

我会使用commons.lang StringUtils.join函数(参见http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html )。 我强烈建议您熟悉这个和其他帮助程序库,以避免重新发明轮子。

您还可以使用以下方法:

 public static String toString(List list, String separator) { StringBuilder sb = new StringBuilder(); Iterator it = list.iterator(); while (it.hasNext()) { Object next = it.next(); sb.append(next); if (it.hasNext()) { sb.append(separator); } } return sb.toString(); } 

增强的for语句相当于表单的基本for语句:

 for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt TargetType Identifier = (TargetType) #i.next(); Statement } 

#i是自动生成的标识符

好吧,这不会检测循环中的第一次迭代,但解决了问题。 只需将分隔符附加在每个字符串的末尾并切断最后一个分隔符。

 StringBuilder builder = new StringBuilder() ; for ( String s : list ) { builder.append(s) ; builder.append(separator); } builder.setLength(builder.length() - separator.length()); return builder.toString() ;