java.lang.String 上的 split 方法返回一个数组,而不是 ArrayList。您可以改用 tokenize 方法(尽管它不需要正则表达式,这对于在空格上拆分的简单情况来说不是问题),或者在拆分后将数组转换为列表,使用 Arrays.asList 或 as List.
在 Groovy 中,拆分和标记化都默认使用空格作为分隔符,因此不需要正则表达式,line.split() as List 或 line.tokenize() 就足够了。制表符和空格都得到处理,重复的工作方式类似:
groovy:000> s = ' a\tb c d '
===> a b c d
groovy:000> s.tokenize()
===> [a, b, c, d]
groovy:000> s.split() as List
===> [a, b, c, d]
输出[Ljava.lang.String 是a notation telling you you have an array of Strings。您可以通过在类上调用 isArray() 来检查某物是否为数组:
file3[0].class.isArray()
MissingMethodException 表示您正在对数组调用 removeAll。您可以检查对象上可用的方法:
groovy:000> a = s.split()
===> [a, b, c, d]
groovy:000> a.class.isArray()
===> true
groovy:000> a.class.methods
===> [public final void java.lang.Object.wait(long,int) throws java.lang.Interru
ptedException, public final native void java.lang.Object.wait(long) throws java.
lang.InterruptedException, public final void java.lang.Object.wait() throws java
.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Obj
ect), public java.lang.String java.lang.Object.toString(), public native int jav
a.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.g
etClass(), public final native void java.lang.Object.notify(), public final nati
ve void java.lang.Object.notifyAll()]
groovy:000> a.class.methods*.toString().grep {it.contains('removeAll')}
===> []
你希望最后一个例子做什么?因为 collect 的调用会返回一个布尔值列表:
groovy> stuff=['asdf', 'zxcv', 'qwerty', '', 'zzz']
groovy> stuff.collect { it != '' && it != null }
Result: [true, true, true, false, true]
collect 方法为调用它的集合创建一个转换后的副本。但是 each 不返回修改后的集合,它返回原始未修改的集合,这是一个示例:
groovy> def mylist = ['asdf', 'zxcv', 'qwerty']
groovy> def foo = mylist.each {it.toUpperCase()}
groovy> foo
Result: [asdf, zxcv, qwerty]
这里 each 中的闭包对 mylist 或 foo 的内容没有影响,这与您使用 collect 或 mylist*.toUpperCase() 不同,后者返回通过对 mylist 的每个元素执行闭包创建的条目集合。
您似乎对 collect 的作用感到困惑,并且尝试使用它进行过滤(这不起作用)。这是从字符串列表中删除空字符串的示例:
groovy> def mylist = [['a', 'b', ''], ['', 'c', 'd'], ['e', '', 'f']]
groovy> println mylist.collect {it.findAll()}
[[a, b], [c, d], [e, f]]
调用 findAll 的 it 是一个字符串列表。