java - 为什么 String.chars() 在 Java 8 中是整数流?

标签 java string java-8

在 Java 8 中,有一个新方法 String.chars()它返回代表字符代码的 ints (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/

相关文章:

java - 如何在多线程应用程序中使用 Hibernate?

java - 如何使用 Java 中的 Quartz Scheduler 框架运行 cron 作业?

string - 如何将字符附加到 Golang 中的字符串?

python - 统计word中大写和小写字符的个数

javafx 8 兼容性问题 - FXML 静态字段或方法

java - Java 8 中用于减去列表的减法运算

java - 使用Spring Boot根据输入请求中的字段创建类链的不同实例

php - 字符串替换单词数组中不区分大小写的完全匹配项

Java流将数组收集到一个列表中

java - 如何向 JTree 添加鼠标监听器,以便我可以在将鼠标悬停在节点上时更改光标(变为手形光标)?