Groovy是否支持Pairs(例如来自Java或C ++)?如果没有,那么解决这个问题的好方法是什么?
答案 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的角度来看,此对象具有属性对left
和right
,或者key
和value
,因为该类实现了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依赖项。