Java中支持元组(异构元素的不可修改的有序列表)

时间:2012-12-20 17:15:26

标签: java tuples

我想知道为什么Java在其标准库中没有元组数据结构实现。例如,C ++具有a very good implementation这个固定大小的异构值集合。 Haskell中也是如此。在Java中,我只通过ProductP1 - P8)类型知道javatuplesFunctional Java库中的一些支持。我想知道为什么tuple或至少pair根本不在标准库中?甚至Android SDK开发人员也添加了own implementation的2元组(对)。

6 个答案:

答案 0 :(得分:12)

“Java方式”是定义特定于使用的类而不是这些轻量级的半类类型。如果你考虑一下,元组实际上只是一个简化的结构; Java人员希望你继续创建结构。

这个观点正在发生一些变化,尤其是Java 8中的lambdas(它对JDK施加压力以提供通用的Function - 类型接口而不是像FooCallback这样的特定于用例的接口) 。但对于许多Java开发人员来说,它仍然是一个相当强大的思维模式,并且有一些意义。 Java是一种非常静态类型的语言;元组系统介于静态类型和动态类型之间,因为类型系统中没有任何内容可以阻止您认为代表客户ID的(int, String)和名称实际上是表示订单ID的(int, String)它的描述。

例如,在Guava项目中的问题上查看this discussion(“元组为n> = 2”)。当然,这不是官方的;但它是Java思维方式的一个很好的代表。

答案 1 :(得分:9)

有一个名为javatuples的好库。它定义了从1(Unit)到10(Decade)的arities的通用元组类型以及所有基本方法,如equalshashCodetoString甚至{ {1}}。

官方网站:http://www.javatuples.org/
Maven依赖:

compareTo

(目前最新版本为<dependency> <groupId>org.javatuples</groupId> <artifactId>javatuples</artifactId> <version>[version]</version> <scope>compile</scope> </dependency>

答案 2 :(得分:4)

它有:

Collections.unmodifiableList(yourList)

会做到这一点。

我认为JCF的多功能性使得显式元组数据结构的存在变得不必要。

我假设 tuple 是指一个有序的不可变元素列表(根据wikipedia definition)。

至于第三方图书馆,我在google上的搜索功能thisthis,当然还有this

答案 3 :(得分:1)

几周前,我和一位同事正在讨论这个问题。我能想出的唯一解决方案是将值内部存储在Map<Class, Object>中,并使用一些存取方法getValue(Class)。否则,如何访问元组中的值?您不能拥有通用的Tuple类,其中包含每个成员的方法,例如: getIntegergetString等等,因为在创建元组时,直到运行时才会知道这些方法。这也意味着你永远不会有两个具有相同类型的成员 - 你如何能够编写这样一个类,以便在运行时知道要检索哪个对象?

答案 4 :(得分:1)

FunctionalJava提供了一组我认为符合这个想法的P(产品)类。它提供P1 - P8以允许最多8个元素元组。我同意瓜瓦的解释,为什么他们气馁,但你去了。

FunctionalJava-P

答案 5 :(得分:1)

Java运行时中有一个类型,它叫做Entry。这是Map中的一个接口,在AbstractMap中有简单的实现。

http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html

http://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html

您可以将它用作两个成员的元组,甚至可以应用泛型。如果我需要更多元素而不是两个,我会认真思考我做错了什么。那么可能值得拥有自己的课程。