java - 为什么 Groovy 用 size() 替换 java.lang.String.length()?

标签 java string groovy jvm-languages

维基百科的 current article关于 Groovy 编程语言的解释是“大多数有效的 Java 文件也是有效的 Groovy 文件”,并给出了以下示例,首先是 Java 代码:

for (String it : new String[] {"Rod", "Carlos", "Chris"})
    if (it.length() <= 4)
        System.out.println(it);

然后在 Groovy 中也是如此:

["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}

请注意,在第一个示例中,我们使用了非常普通的 Java 方法 java.lang.String.length() .在第二个示例中,此方法被神秘地替换为对名为 size() 的方法的调用。我有 verified第二个示例是有效的 Groovy 代码并且具有正确的行为。

java.lang.String 没有名为 size() 的方法。 Groovy 不会出于自己的目的将 String 子类化:

String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"

它也不会以某种方式向 String 对象添加额外的方法:

// [...]
for (def method : c.getMethods()) {
    println method.getName()
}
// prints a whole bunch of method names, no "size"

但这段代码仍然可以正常工作:

// [...]
println s.size() // "0"

我找不到任何 Groovy 文档来解释这一点。

  • size() 从何而来?
  • 为什么它没有出现在对象上?
  • 为什么添加它?
  • length() 有什么问题,为什么不推荐使用它?
  • java.lang.String 添加了哪些其他方法?
  • 其他标准类呢?

最佳答案

Groovy 为字符串和各种其他类添加了许多方法。所有的便利方法都是 Groovy 之所以伟大的部分原因。

java.lang.String 实现了 java.lang.CharSequence,这就是它获得全部(大部分)魔力的地方。 size() , 例如。 Groovy 向大多数对象添加了一个 size() 方法,这些对象可能具有您认为的大小,以便您可以全面使用一致的方法。 length() 仍然完全有效,Groovy 不会删除它。

要查看 Groovy 添加的一些方法,请查看 GDK ,特别是 CharSequenceCollection .

关于java - 为什么 Groovy 用 size() 替换 java.lang.String.length()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433991/

相关文章:

java - 在 Apache Camel 中修改主体的最佳方法?

java - Eclipse 中的 Hibernate 工具 : Change in column values does not reflecting in the query result

java - 线程 "main"java.util.NoSuchElementException 中出现异常,同时获取未知数量的输入,然后获取另一个输入

Mysql 字符串函数的正确大小写

c++ - 计算一个单词中的音节数,但考虑到单词中任何相邻的元音都算作一个音节

grails - 合并两个域对象,并在Grails中将子对象重新分配给其中一个

java - 无限期停止线程的有效方法是什么?

java ->>= 和 >>>= 的区别

c - 如何根据字符串的值访问 `struct' 的成员?

java - Groovy 不执行 Java-Method(签名包括泛型)