我想对字符串中的每个字符进行迭代。
所以我想:
for (char c : "xyz")
但我得到一个编译器错误:
MyClass.java:20: foreach not applicable to expression type
我该怎么做呢?
我想对字符串中的每个字符进行迭代。
所以我想:
for (char c : "xyz")
但我得到一个编译器错误:
MyClass.java:20: foreach not applicable to expression type
我该怎么做呢?
当前回答
在Java 8中,我们可以将其求解为:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
方法chars()返回doc中提到的IntStream:
返回一个int 0的流,从this扩展char值 序列。将传递映射到代理代码点的任何字符 通过粗略的。如果序列发生突变,而流发生突变 被读取时,结果是未定义的。
为什么使用forEachOrdered而不是forEach ?
forEach的行为是显式的不确定的,其中forEachOrdered为流的每个元素执行一个操作,如果流具有定义的遇到顺序,则按照流的遇到顺序执行。因此forEach并不保证顺序会被保持。请检查这个问题以了解更多信息。
我们也可以使用codePoints()来打印,更多细节请参见这个答案。
其他回答
for-each String中的每个字符最简单的方法是使用toCharArray():
for (char ch: "xyz".toCharArray()) {
}
这为您提供了for-each结构的简便性,但不幸的是,String(不可变)必须执行防御性复制来生成char[](不可变),因此有一些代价。
从文档中可以看到:
[toCharArray()返回]一个新分配的字符数组,其长度为该字符串的长度,其内容被初始化为包含该字符串表示的字符序列。
在数组中迭代字符有更冗长的方法(常规for循环,CharacterIterator等),但如果你愿意付出代价,toCharArray() for-each是最简洁的。
在Java 8中,我们可以将其求解为:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
方法chars()返回doc中提到的IntStream:
返回一个int 0的流,从this扩展char值 序列。将传递映射到代理代码点的任何字符 通过粗略的。如果序列发生突变,而流发生突变 被读取时,结果是未定义的。
为什么使用forEachOrdered而不是forEach ?
forEach的行为是显式的不确定的,其中forEachOrdered为流的每个元素执行一个操作,如果流具有定义的遇到顺序,则按照流的遇到顺序执行。因此forEach并不保证顺序会被保持。请检查这个问题以了解更多信息。
我们也可以使用codePoints()来打印,更多细节请参见这个答案。
另一个有用的解决方案,您可以将此字符串作为string数组使用
for (String s : "xyz".split("")) {
System.out.println(s);
}
如果你使用Java 8,你可以在字符串上使用chars()来获得字符流,但是你需要将int类型转换回char类型,因为chars()返回IntStream。
"xyz".chars().forEach(i -> System.out.print((char)i));
如果您使用Java 8和Eclipse Collections,您可以使用CharAdapter类forEach方法和lambda或方法引用来遍历字符串中的所有字符。
Strings.asChars("xyz").forEach(c -> System.out.print(c));
这个特殊的例子也可以使用方法引用。
Strings.asChars("xyz").forEach(System.out::print)
注意:我是Eclipse Collections的提交者。
你需要使用String类的toCharArray()方法将String对象转换为一个char数组:
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}