流的限制不适用于基于字符数组的流
为什么下面的代码不能将输出限制为前三个字符?流的限制不适用于基于字符数组的流
String vowelOne = "aaebcd";
Stream
.of(vowelOne.toCharArray())
.limit(3)
.forEach(System.out::println);
输出:
aaebcd
我想要的输出为:
aae
Stream.of(char[])
产生单一char[]
元件(就像Arrays.asList()
的Stream
为基本数组将产生List
单个元素),所以limit(3)
不会截断Stream
,并且您正在打印整个char[]
(您也可以看到,即使使用println
,所有字符都打印在一行中)。
尝试:
vowelOne.chars() // this returns an IntStream of the characters of the input String
.limit(3)
.forEach(i->System.out.println((char)i)); // without the casting to char, you'll
// get the numeric value of the first 3
// characters
输出:
a
a
e
我会去codePoints()在这里,而不是字符( )。 – Eugene
至于叶兰提到,Stream.of(char[])
会产生Stream<char[]>
,而不是Stream<char>
,因为你需要它的人。还有其他方法可以规避这一点。你要么需要盒装型Character[]
static Character[] toCharacterArray(String s) {
Character[] array = new Character[s.length()];
for(int i = 0; i < s.length(); i++) {
array[i] = s.charAt(i);
}
return array;
}
的数组,并使用它像这样
Stream
.of(toCharacterArray(vowelOne))
.limit(3)
.forEach(System.out::println);
或者你可以使用String.split("")
创建String[]
String vowelOne = "aaebcd";
Stream
.of(vowelOne.split(""))
.limit(3)
.forEach(System.out::println);
两种方法都导致
a
a
e
您刚刚创建了每个字符的数组并将其保存在String []中,则您将数组数限制为。 它会工作,但不认为你只是复杂它,而不是简单地输入一串字符,它的杂乱的tbh。 –
@AhmadAlsanie我在哪里可以将每个字符保存在一个String []中? – QBrute
vowelOne.split(“”) - >将创建一个String [a],String [a],String [e],String [b],String [c],String [d] –
通常,codePoints()代替chars()更好,它也处理代理对。我不得不承认,在这个问题上你的情况可能太多了。
private static String firstN(String input, int limit) {
StringBuilder builder = new StringBuilder();
input.codePoints().limit(limit).forEach(builder::appendCodePoint);
return builder.toString();
}
这会导致问题“限制”是指什么。即使代码点不是概念性的字符,也就是说,您仍然可能会在由多个代码点组成的字符中间分割。顺便说一句,'.mapToObj(i - > i)'已经过时了,只是在下一步做一个拆箱操作的拳击操作。 – Holger
@Holger的确如此。我立即想到了有多个代码点的梵文字母。对于像法文和瑞典文这样简单的例子,规范化需要首先应用,对于那些我认为不诚实的梵文字母。是的,那张地图是一个糟糕的复制/粘贴,thx。 – Eugene
请注意,您可以使用'collect'使其更清洁'forEach'less解决方案,如[此处](http://stackoverflow.com/a/20268845/2711488)所示。 – Holger
参见http://stackoverflow.com/questions/39874242/stream-vs-stream-of/39874305和http://stackoverflow.com/questions/32471799/convert-a-string-to- a-java-util-streamcharacter和http://stackoverflow.com/questions/27888429/how-can-i-create-a-stream-from-an-array – Tunaki