流的限制不适用于基于字符数组的流

问题描述:

为什么下面的代码不能将输出限制为前三个字符?流的限制不适用于基于字符数组的流

String vowelOne = "aaebcd"; 

Stream 
    .of(vowelOne.toCharArray()) 
    .limit(3)  
    .forEach(System.out::println); 

输出:

aaebcd 

我想要的输出为:

aae 
+0

参见http://*.com/questions/39874242/stream-vs-stream-of/39874305和http://*.com/questions/32471799/convert-a-string-to- a-java-util-streamcharacter和http://*.com/questions/27888429/how-can-i-create-a-stream-from-an-array – Tunaki

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 
+1

我会去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 
+0

您刚刚创建了每个字符的数组并将其保存在String []中,则您将数组数限制为。 它会工作,但不认为你只是复杂它,而不是简单地输入一串字符,它的杂乱的tbh。 –

+0

@AhmadAlsanie我在哪里可以将每个字符保存在一个String []中? – QBrute

+0

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(); 
} 
+1

这会导致问题“限制”是指什么。即使代码点不是概念性的字符,也就是说,您仍然可能会在由多个代码点组成的字符中间分割。顺便说一句,'.mapToObj(i - > i)'已经过时了,只是在下一步做一个拆箱操作的拳击操作。 – Holger

+1

@Holger的确如此。我立即想到了有多个代码点的梵文字母。对于像法文和瑞典文这样简单的例子,规范化需要首先应用,对于那些我认为不诚实的梵文字母。是的,那张地图是一个糟糕的复制/粘贴,thx。 – Eugene

+0

请注意,您可以使用'collect'使其更清洁'forEach'less解决方案,如[此处](http://*.com/a/20268845/2711488)所示。 – Holger