【问题标题】:What is better word.toUpperCase().chars() or word.chars().map(Chars::toUpperCase)?word.toUpperCase().chars() 或 word.chars().map(Chars::toUpperCase) 哪个更好?
【发布时间】:2021-11-03 07:17:26
【问题描述】:

我们需要从大写字符串中获取字符流。有两种方法:

  1. word.toUpperCase().chars()

  2. word.chars().map(Character::toUpperCase)

哪种方法更好?

附:按照 cmets 中的要求,我指定了使用代码的整个方法:

private int[] toSortedChars(final String word) {
   return word.chars().map(Character::toLowerCase).sorted().toArray();
}

该方法用于解题: https://exercism.org/tracks/java/exercises/anagram

【问题讨论】:

  • 我的直觉告诉我,第二种方法更快更好,因为它不会创建额外的字符串。
  • 第二种方法占用的空间更大,因为它创建了一个流并且代码更简单。但是您是否尝试过对其进行基准测试?
  • 这主要取决于你想对生成的IntStream 做什么,你能澄清一下吗?
  • 我和 Lino 在一起 - 你需要告诉我们你想对大写字符做什么。正如 Hoopje 正确指出的那样,某些输入的结果会有所不同。我们无法判断哪个版本更符合您的用例,任何性能考虑都取决于您为流考虑的终端操作。
  • 所以除了答案中提到的问题之外,无论如何这都有限制。 Unicode 的字符跨越多个char 单元甚至多个代码点。如果您接受方法的局限性,则可以继续使用第二种方法,处理 n:m 案例映射无论如何都不会在排序后产生可理解的结果。

标签: java string java-stream


【解决方案1】:

第一种方法更好。

Character.toUpperCase 的 Javadoc 提到:

一般来说,String.toUpperCase() 应该用于将字符映射为大写。字符串大小写映射方法比字符大小写映射方法有几个好处。字符串大小写映射方法可以执行区域敏感映射、上下文敏感映射和 1:M 字符映射,而字符大小写映射方法不能。

您现在可能不会考虑与英语不同的语言,但在某些时候您可能希望支持其他语言,然后大写变得更加困难,因为字符不能再单独大写了。

例如:"Straße".toUpperCase() 返回"STRASSE"(即使在英语语言环境中),如果您将每个字符分别转换为大写,则无法复制这种行为。

(注意:最近,大写的“ß”被添加到德语中,但目前不常用,除了大写名称。)

【讨论】:

  • 当然,这在很大程度上取决于后续操作。如果对于 OP 实际想要做的任何事情都不推荐这两种方法,我不会感到惊讶……
  • 感谢您提供非常有用的答案。我不知道一个字符可能映射到多个。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2021-08-12
  • 2019-02-23
  • 2010-12-19
  • 1970-01-01
  • 2013-01-11
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多