在Groovy中的Pair<L, R>

10
Groovy支持Pair类型(例如来自Java或C ++的类型)吗?如果不支持,有什么好的方法可以解决这个问题?

我假设你已经写了Pair类? - tim_yates
1
请告诉我们关于您问题中的“pair” / “Pair”究竟是什么意思。 - jwpfox
3个回答

15

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'

9
Groovy有一个Tuple2类,正如Gergely的答案所述。
然而,还有一种返回Pair或tuple的替代方法可能更容易;Groovy支持一种称为多重赋值的特性,您可以将数组或列表的成员分配给不同的变量:
groovy:000> (a, b) = [1, 2]
===> [1, 2]
groovy:000> a
===> 1
groovy:000> b
===> 2

变量不必具有相同的类型。因此,您可以从方法调用中返回一个包含两个条目的列表,并让调用者将它们分配给不同的变量,而无需涉及任何专门的容器,如Pair或Tuple2,其中您必须从中解压缩值。
如果您想要具有明确名称的明确定义的合同,则使用自己的类。或者使用Map,这样您至少可以使用键为返回的不同内容分配名称。
使用Tuple2或Pair与使用多重赋值一样受顺序影响,在命名方面没有任何改进,并且添加了额外的样板代码来打包和解包。

1

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

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,或者由于该类实现了Map.Entry,也可以选择keyvalue
示例Groovy用法:
def p = Pair.of("hello", "world")
assert p.left == "hello"
assert p.right == "world"
assert p.key == "hello"
assert p.value == "world"

据我所知,在Java API中没有Pair类(在此处已验证),因此你可能看到的任何使用Pair对象的Java代码都可能使用相同的Apache Commons依赖项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接