我可以将字符串作为参数添加到传统的 for 循环中吗?

Can I add a String as a parameter to a traditional for loop?

我意识到这不是一个大问题,但我想在我的测试中完成类似的代码清洁度。 (我也意识到 "clean" 是主观的,我宁愿不进入代码审查 session,哈哈。)出于某种原因,传统的 for 循环拒绝允许 String 作为在其中初始化的变量之一。目前,我编译的内容如下:

Iterator<String> keys = map.keySet().iterator();
String next = null;
for(int i = 0; keys.hasNext(); i++, next = keys.next()) {
    //stuff
}

...但是如果有这样的东西就好了:

for(int i = 0, String next = null; keys.hasNext(); i++, next = keys.next()) {
    //stuff
}

我希望它起作用的原因是因为我们可以有多个变量的 for 循环。

for(int i = 0, j = 0; i < 0 && j < 0; i++, j++) {
    // stuff
}

不幸的是,无论出于何种原因,String 版本都会出现编译错误。有什么办法可以做到这一点?我只是有一些语法错误吗?如果不可能,有什么原因吗?


对于所有感到沮丧并想争辩说这是愚蠢的人,我需要 i 以及 Iterator 的原因是为了 JUnit 测试目的。我有一个 LinkedHashMap(已排序),我需要断言第一个元素 = X,第二个元素 = Y,第三个元素 = Z,等等。但是 keySet() returns 只有 Set 不允许您按索引获取。你只能迭代它。因此,我需要 i 变量来跟踪我在断言迭代器中的位置。

for statement的初始化部分只接受你声明一种类型的变量。 所以你可以有多个声明,但它们必须都是同一类型,并且该类型可以是 String.

for (String example = "some string"; example.length() > 0; example = example.substring(1))
    System.out.println(example);

或声明列表

for (String example = "some string", another = "woot", someMore = "these too!"; example.length() > 0; example = example.substring(1))
    System.out.println(example);

试试这个?它将密钥列表保存到一个数组列表中并对其进行迭代

Map<String, String> map = new HashMap<String, String>();
map.put("A", "AA");
map.put("B", "BB");

List<String> keys = new ArrayList<String>(map.keySet());
for(String s:keys) {
    System.out.println(keys.indexOf(s)+" "+s);
    // stuff
}

编辑:我知道您正在寻找更简洁的代码,但让 for 循环变长并不一定可行,变量名和正确的格式将使代码比更改迭代地图 imo 的方式更简洁