在Groovy中配对<l,r =“”>

时间:2016-09-09 21:25:42

标签: groovy

Groovy是否支持Pairs(例如来自Java或C ++)?如果没有,那么解决这个问题的好方法是什么?

3 个答案:

答案 0 :(得分:9)

Groovy使用类Tuple2支持对。

使用Tuple2的一个小例子:

def m = [a: new Tuple2(1, 2)]

m.b = new Tuple2('1', '2')

assert m.a.first == 1
assert m.a.second == 2

assert m.b.first == '1'
assert m.b.second == '2'

使用Map作为值

,也可以达到或多或少相同的效果
def n = [a: [first: 1, second: 2]]
n.b = [first: '1', second: '2']

assert n.a.first == 1
assert n.a.second == 2

assert n.b.first == '1'
assert n.b.second == '2'

答案 1 :(得分:5)

Groovy将Tuple2类作为Gergely's answer个状态。

但是,使用可能更容易的Pair或tuple的替代方法; Groovy支持一个名为multiple assignment的功能,您可以在其中将数组或列表的成员分配给不同的变量:

groovy:000> (a, b) = [1, 2]
===> [1, 2]
groovy:000> a
===> 1
groovy:000> b
===> 2

变量不必具有相同的类型。

因此,您可以返回一个包含方法调用中的两个条目的列表,并让调用者将它们分配给不同的变量,而不必涉及任何类型的专用容器,如Pair或Tuple2,您必须在其中解压缩来自它的价值。

如果你想要一个定义明确的合同,那就去你自己的班级。或者使用Map,这样您至少可以使用键为返回的不同内容指定名称。

使用Tuple2或Pair对列表的顺序敏感,在命名方面是零改进,并添加额外的样板代码以打​​包和解包。

答案 2 :(得分:1)

Apache Commons Lang v3中有一个广泛使用的Pair抽象(gradle coordinates 'org.apache.commons:commons-lang3:+')。类签名如下所示:

package org.apache.commons.lang3.tuple;
public abstract class Pair<L, R> implements Map.Entry<L, R>, Comparable<Pair<L, R>>, Serializable

如果在构建中包含此库,并导入该类,则可以使用静态方法Pair.of(left,right)来创建实例。从Groovy的角度来看,此对象具有属性对leftright,或者keyvalue,因为该类实现了Map.Entry

示例Groovy用法:

def p = Pair.of("hello", "world")
assert p.left == "hello"
assert p.right == "world"
assert p.key == "hello"
assert p.value == "world"

AFAIK,Java API中没有Pair类(已验证here),因此您在Pair个对象中看到的任何Java代码都可能使用相同的Apache Commons依赖项。