通过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() ;