- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我从这段代码中看到了一些令人困惑的行为。
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。您可以改用方法标记化(尽管它不需要正则表达式,这对于在空格上拆分的简单情况来说不是问题),或者在拆分后使用 Arrays.asList 或 as List 将数组转换为列表
。
在 Groovy 中,split 和 tokenize 都有默认假设以空格作为分隔符,因此不需要正则表达式,无论是 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 的调用将返回一个 boolean 值列表:
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]
这里的 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
是一个字符串列表。
关于java - Groovy ArrayList 对字符串感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965351/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!