正如其他人已经提到的,背后的设计决定是为了防止方法和类的爆炸。
不过,我个人认为这是一个非常糟糕的决定,应该,由于他们不想使CharStream,这是合理的,不同的方法,而不是chars(),我会想到:
> Stream< Character> chars(),它提供了一个盒子字符流,这将有一些轻的性能损失。
> IntStream unboxedChars(),它将用于性能代码。
然而,不是专注于为什么这是目前这样做,我认为这个答案应该重点展示一个方法来做到这一点,我们已经得到了Java 8。
在Java 7中,我会这样做:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
我认为在Java 8中做一个合理的方法如下:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
这里我获得一个IntStream并将其映射到一个对象通过lambda i – > (char)i,这将自动将其封装成一个Stream< Character> ;,然后我们可以做我们想要的,仍然使用方法引用作为加号。 注意,虽然你必须做mapToObj,如果你忘记和使用地图,没有什么会抱怨,但你仍然会得到一个IntStream,你可能会被遗忘,为什么它打印整数值,而不是代表的字符串字符。 其他丑陋的替代Java 8: 通过保留在IntStream中并且希望最终打印它们,您不能再使用方法引用进行打印:
hello.chars()
.forEach(i -> System.out.println((char)i));
此外,使用方法引用你自己的方法不工作了!考虑以下:
private void print(char c) {
System.out.println(c);
}
接着
hello.chars()
.forEach(this::print);
这将产生编译错误,因为可能有一个有损的转换。
结论:
API是这样设计的,因为不想添加CharStream,我个人认为该方法应该返回一个Stream< Character> ;,目前的解决方法是在IntStream上使用mapToObj(i - >(char)i)能够与他们正常工作。