哪个更好,word.toUpperCase().chars()还是word.chars().map(Chars::toUpperCase)?

3

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

  1. word.toUpperCase().chars()

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

哪种方法更好?

P.S. 根据评论要求,我在此指定了使用代码的整个方法:

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

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

我的直觉告诉我第二种方法更快、更好,因为它不会创建额外的字符串。 - Jegors Čemisovs
第二种方法由于创建流并具有更简单的代码而占用更多空间。但是你尝试过进行基准测试吗? - Just another Java programmer
4
这主要取决于您想如何使用生成的 IntStream,您可以澄清一下这一点吗? - Lino
2
我同意Lino的观点 - 你需要告诉我们你想如何处理大写字符。正如Hoopje正确指出的那样,某些输入将产生不同的结果。我们无法确定哪个版本更符合您的用例,并且任何性能考虑都取决于您对流的终端操作。 - Hulk
2
所以这种方法无论如何都存在限制,超出答案中提到的问题。Unicode具有跨越多个“char”单元甚至多个代码点的字符。如果您接受了您的方法的局限性,您可以继续使用第二种方法,在排序后处理n:m案例映射也不会导致可理解的结果。 - Holger
显示剩余2条评论
1个回答

9
第一种方法更好。
Character.toUpperCase的Javadoc提到:
一般来说,应该使用String.toUpperCase()将字符转换为大写。与Character大小写映射方法相比,String大小写映射方法具有几个优点。String大小写映射方法可以执行区域设置敏感的映射、上下文敏感的映射和1:M字符映射,而Character大小写映射方法则无法实现这些功能。
您可能现在没有考虑英语以外的不同语言,但是在某些时候,您可能希望支持其他语言,然后大写变得更加困难,因为单独的字符不能再大写了。
例如:"Straße".toUpperCase()返回"STRASSE"(即使在英语环境中),如果您正在对每个字符单独进行大写转换,则无法复制此行为。
(注意:最近德语中添加了一个大写的"ß",但除了大写名称之外,它还没有被广泛使用。)

2
当然,这在后续操作上非常依赖。如果无论OP想要做什么,两种方法都不被推荐,我也不会感到惊讶... - Holger
非常感谢您提供如此有用的答案。我不知道一个字符可能会被映射到多个字符。 - Jegors Čemisovs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接