在 Java 8 中,有一个新方法 String.chars()
它返回代表字符代码的 int
s (IntStream
) 流。我想很多人会期望这里有 char
流。以这种方式设计 API 的动机是什么?
最佳答案
正如其他人已经提到的,这背后的设计决策是为了防止方法和类的爆炸。
不过,我个人认为这是一个非常糟糕的决定,而且应该这样做,因为他们不想做出 CharStream
,这是合理的,不同的方法而不是chars()
,我会想到:
-
Stream<Character> chars()
,这会给出一个框字符流,这将有一些轻微的性能损失。 -
IntStream unboxedChars()
,这将用于性能代码。
然而,与其关注为什么目前这样做,我认为这个答案应该侧重于展示一种使用我们拥有的 API 的方法使用 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
,如果您忘记并使用 map
,那么什么都不会提示,但你仍然会得到 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>
,目前的解决方法是使用 mapToObj(i -> (char)i)
在 IntStream
能够与他们正常工作。
关于java - 为什么 String.chars() 在 Java 8 中是整数流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22435833/