考虑Java中的Pair类
背景 – (background)
如果您只需要Key和Value的数据,您会用什么来实现它呢?在Java中,使用Map是没有问题的,但并不是一种很智能的方式。
在Java SE中并没有实现Pair(并非完全没有,但并不为人所知),所以我查阅了一些开源软件。
抽象地图SimpleEntry
实际上,从1.6版本开始,已经提供了一个用于Pair的标准API。这个API的实现是Entry。听起来名称有点拗口。
创建实例
新的AbstractMap.SimpleEntry(key, value)
获取键值对
Key 通过使用 getKey() 方法获取,而 Value 通过 getValue() 方法获得。
数值的改变
只能使用 setValue 方法来修改 Value。
準備好考試
AbstractMap中还有一个名为SimpleImmutableEntry的类。使用这个类,我们可以处理无法更改的元素,这样就可以实质上禁用setValue方法。当调用setValue方法时,会引发UnsupportedOperationException异常。这个实现对您来说是否有用呢?
关于名字太长的问题,只要按照下面的方式进行处理,就可以解决。
public class Pair<K, V> extends AbstractMap.SimpleEntry<K, V> {
/** serialVersionUID. */
private static final long serialVersionUID = 6411527075103472113L;
public Pair(final K key, final V value) {
super(key, value);
}
}
测试代码
-
- 对偶 (AbstractMap.SimpleEntry)
- 不可变对偶 (AbstractMap.SimpleImmutableEntry)
javafx.util.Pair 的中文翻译为 javafx.util.对。
这是JavaFX 2.0及更高版本中包含的Pair类的实现。它几乎可以像上述的SimpleEntry类一样使用。但是它不能交换值。
测试代码
成对
配对(Eclipse Collections)
Eclipse Collections是去年的圣诞礼物。当你想要在Key和Value中使用不同的类型时,请使用此方法。通过swap方法可以有趣地交换Key和Value。
创建实例
Tuples.pair(key, value) 可以用中文翻译为「元组.成对(键,值)」。
获取键值对的值
Key 是通过 getOne() 获取的,而 Value 则是通过 getTwo() 获取的。
修改值
没有该方法存在。调用错误不会引发异常。
另外,存在着一个名为put的方法。它不是用于设置Pair的值,而是将Pair所拥有的键(Key)和值(Value)放入传递的Map参数中的方法。如果传递的Map是不可修改的(unmodifiable),将会引发异常。
另外
可以使用swap方法获取通过交换键和值后的Pair。
测试代码
配对(Eclipse Collections)
双胞胎(Eclipse集合)
如果键和值具有相同的类型,则使用此选项。
创建实例
元组.双(key, value)
获取键值对
键是通过getOne()获取的,值是通过getTwo()获取的。
改动值
没有,实际上根本不存在该方法。调用错误也不会导致出现异常。
注意,尽管存在put方法,但该方法并不是为Twin设置值,而是将Twin的键和值放入传递的Map参数中的方法。如果传递的Map是不可修改的,则会引发异常。
除此之外
您可以使用swap方法获取将键(key)和值(value)交换的Twin。
测试代码
双胞胎
org.apache.commons.lang3.tuple.Pair 翻译为中文为:组织.apache.commons.lang3.tuple.Pair
Apache Commons Collections 提供了这些功能。可以使用工厂方法创建实例,可以选择可变或不可变对象,还可以选择不同的值提取方式,非常细致地设计了这些特性。
创建实例
-
- 公对包含键值对的一对对象进行配对
- 可变公对包含键值对的一对对象进行配对
获取键值对的值
键可以是getKey()或者getLeft(),值可以是getValue()或者getRight(),都可以。
数值的更改
MutablePair可以通过setValue()方法仅修改值。
无法更改的Pair或ImmutablePair,当调用setValue()方法时会引发UnsupportedOperationException异常。
考试代码
-
- 不可变的配对
- 可变的配对
比较表可以通过以下方式进行概括。
总结
如果没有使用开源软件的申请程序繁琐等理由,可以考虑使用Eclipse Collections 或者 Apache Collections。
链接
GitHub代码库(pair_verification)。