我想知道为什么Java在其标准库中没有元组数据结构实现。例如,C ++具有a very good implementation这个固定大小的异构值集合。 Haskell中也是如此。在Java中,我只通过Product
(P1 - P8
)类型知道javatuples和Functional Java库中的一些支持。我想知道为什么tuple
或至少pair
根本不在标准库中?甚至Android SDK开发人员也添加了own implementation的2元组(对)。
答案 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的通用元组类型以及所有基本方法,如equals
,hashCode
,toString
甚至{ {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)。
答案 3 :(得分:1)
Map<Class, Object>
中,并使用一些存取方法getValue(Class)
。否则,如何访问元组中的值?您不能拥有通用的Tuple
类,其中包含每个成员的方法,例如: getInteger
,getString
等等,因为在创建元组时,直到运行时才会知道这些方法。这也意味着你永远不会有两个具有相同类型的成员 - 你如何能够编写这样一个类,以便在运行时知道要检索哪个对象?
答案 4 :(得分:1)
FunctionalJava提供了一组我认为符合这个想法的P
(产品)类。它提供P1
- P8
以允许最多8个元素元组。我同意瓜瓦的解释,为什么他们气馁,但你去了。
答案 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
您可以将它用作两个成员的元组,甚至可以应用泛型。如果我需要更多元素而不是两个,我会认真思考我做错了什么。那么可能值得拥有自己的课程。