Groovy:使用范围运算符创建列表

时间:2017-03-01 04:01:00

标签: list exception groovy range

我试图从int列表中选择一个随机元素,并使用范围运算符创建列表元素:

def date_range = 1..28
assert ('a'..'d').collect() == ['a','b','c','d'] // So this is instanceof List
assert ('a'..'d') == ['a','b','c','d'] // So this is instanceof List
def x1 = (1..28).collect().sort{new Random()}?.take(1)[0] // works
def x2 = date_range.collect().sort{new Random()}?.take(1)[0] // works
def x3 = date_range[0..27].sort{new Random()}?.take(1)[0] //works
def x4 = date_range.sort{new Random()}?.take(1)[0] // does not works

x4低于例外

Caught: java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
    at listManipulation.run(listManipulation.groovy:21)

x4上的错误是什么?

更新

我的困惑是:如果我将date_range定义为def date_range = 1..28并检查如下:assert date_range instanceof List,而不是它通过。为什么我要再次将其转换为列表?

1 个答案:

答案 0 :(得分:0)

date_range的类型为IntRange。不确定为什么在sort上不支持Range。但是toSorted被用来实现同样的目标。

您应该可以使用以下方式调用它:

def date_range = 1..28 
def x4 = date_range.toSorted {new Random()}?.take(1)[0]​
println x4

此外,在array之前将范围转换为listsort(这是x3的情况),如下所示:

println date_range.toList().sort {new Random()}?.take(1)[0]
println date_range.toArray().sort {new Random()}?.take(1)[0]

编辑:根据OP的评论。

date_range是不可变列表。

在你的所有x1,x2,x3中,你只创建一个集合/列表(在不可变列表上),它变得可变,然后能够sort。同样如上。

sort上不允许

immutable list

以下作品。

def mutableList = ['Groovy', 'Java', 'JRuby']
mutableList.sort()

但是,一旦列表不可变,那么它现在允许和结果UnsupportedOperation例外。

def immutableList = ['Groovy', 'Java', 'JRuby'].asImmutable()
immutableList.sort()

希望现在很清楚。