java – Groovy ArrayList对String感到困惑
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Groovy ArrayList对String感到困惑,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3064字,纯文字阅读大概需要5分钟。
内容图文
![java – Groovy ArrayList对String感到困惑](/upload/InfoBanner/zyjiaocheng/753/c735dcadfc90449a8c908f336d6f5b7c.jpg)
我看到这段代码有些令人困惑的行为.
def fileArrayMeta = newFile.readLines()
def file3 = fileArrayMeta.collect{ line -> line.split("\\s+") }
println file3[0]
println file3[0].getClass()
这个操作的预期结果应该是.
=> [, NOTE, *ENTRY, STATEMENT, *.]
=> class java.util.ArrayList
这个操作的实际结果是.
=> [, NOTE, *ENTRY, STATEMENT, *.]
=> class [Ljava.lang.String;
为什么会这样?
println file3[0].removeAll("", null)
线程“main”中的异常groovy.lang.MissingMethodException:没有方法签名:[Ljava.lang.String; .removeAll()适用于参数类型:
(java.lang.String,null)值:[,null]
我认为这也应该有效,为什么不呢?
def clean4 = clean3.each{it.collect{ it != "" && it != null }}
println clean4[0]
解决方法:
java.lang.String上的split方法返回一个数组,而不是ArrayList.您可以使用方法tokenize(虽然它不会使正则表达式对于在空白上拆分的简单情况不是问题),或者在拆分后使用Arrays.asList或List将数组转换为列表.
在Groovy中,split和tokenize都有默认值,假设空格为分隔符,因此不需要正则表达式,line.split()作为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方法生成一个被调用的集合的转换副本.但每个都没有返回修改后的集合,它返回原始未修改的集合,这是一个例子:
groovy> def mylist = ['asdf', 'zxcv', 'qwerty']
groovy> def foo = mylist.each {it.toUpperCase()}
groovy> foo
Result: [asdf, zxcv, qwerty]
这里的闭包对mylist或foo的内容没有影响,不像你使用了collect或mylist * .toUpperCase(),它返回通过对mylist的每个元素执行闭包而创建的条目集合.
看起来你对收集的内容感到困惑,并且你试图用它来过滤(这不起作用).这是从字符串列表列表中删除空字符串的示例:
groovy> def mylist = [['a', 'b', ''], ['', 'c', 'd'], ['e', '', 'f']]
groovy> println mylist.collect {it.findAll()}
[[a, b], [c, d], [e, f]]
调用findAll的是一个字符串列表.
内容总结
以上是互联网集市为您收集整理的java – Groovy ArrayList对String感到困惑全部内容,希望文章能够帮你解决java – Groovy ArrayList对String感到困惑所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。