我正在尝试将String转换为Stream<Character>
并遇到了这个奇怪的事情。
似乎word.toCharArray()
返回一个数组,但是当我尝试通过Arrays.asList(word.toCharArray())
将其转换为列表时,它似乎失败了(输出是一个完整的完整String)。
这里发生了什么?
@Test
public void testCharacterStream() {
characterStreamNew("HELLO");
}
private Stream<Character> characterStreamNew(String word) {
for(Character c: word.toCharArray()) {
out.println(c);
}
Arrays.asList(word.toCharArray()).stream()
.peek(out::println)
.forEachOrdered(out::println);
return null;
}
这是输出:
H
E
L
L
O
HELLO
HELLO
参考方案
这里发生了什么?
这是Arrays.asList
的签名:
public static <T> List<T> asList(T... a)
首先观察到T
必须是引用类型。所有Java类型参数都是引用类型。
第二个观察结果是a
是varargs参数。这意味着a
可以表示为一个或多个T
实例……或T[]
。
以你的例子。似乎您希望以下表达式生成char
或Character
的列表。
Arrays.asList(word.toCharArray())
首先,List<char>
不是有效的Java类型,因为char
不是引用类型。
其次,无法生成List<Character>
,因为签名不允许这样做。我们试试吧。如果T
是Character
,则替换为
public static List<Character> asList(Character... a)
但是Character
实际上是Character[]
,而word.toCharArray()
会生成char[]
。 (并且Java语言不会将char[]
转换为Character[]
。)
实际上,实际发生的是T
与char[]
匹配,并且Arrays.asList
的结果将是List<char[]>
。得到的对象将是一个大小为1的列表,带有一个char[]
元素,其中包含word
的所有字符。
我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…
Java-搜索字符串数组中的字符串 - java在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
从方法返回数组-Java - javaprivate static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…
JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…
添加新商品时如何初始化计数器 - java我有如下所示的数组public static void main(String[] args) { List asList = Arrays.asList("banner","carousel","banner","carousel","banner"); S…