15

我想知道为什么 Java 在其标准库中没有元组数据结构实现。例如,C++对这种固定大小的异构值集合有很好的实现。在Haskell中也是如此。在 Java 中,我只知道javatuples和通过( ) 类型对功能 Java库的一些支持。我想知道为什么或至少不在标准库中?甚至 Android SDK 开发人员也添加了他们自己的 2 元组(对)实现。ProductP1 - P8tuplepair

4

6 回答 6

12

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

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

例如,参见这个关于 Guava 项目中问题的讨论(“Tuples for n >= 2”)。当然,这不是官方的。但它很好地代表了 Java 的思维方式。

于 2012-12-20T17:56:21.347 回答
9

有一个不错的库叫做javatuples. Unit它定义了从 1( ) 到 10( )的元组的通用元组类型Decade以及所有基本方法,例如,equals和even 。hashCodetoStringcompareTo

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

<dependency>
    <groupId>org.javatuples</groupId>
    <artifactId>javatuples</artifactId>
    <version>[version]</version>
    <scope>compile</scope>
</dependency>

(目前最新版本是1.2

于 2013-06-08T10:49:39.643 回答
4

它有:

Collections.unmodifiableList(yourList)

会成功的。

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

我假设元组是指元素的有序不可变列表(根据维基百科定义)。

至于第 3 方图书馆,我在 google 上的强力搜索得到了这个这个,当然还有这个

于 2012-12-20T17:18:07.150 回答
2

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

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

于 2015-03-11T18:52:55.843 回答
1

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

于 2012-12-20T17:33:58.470 回答
1

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

函数式Java-P

于 2012-12-20T17:38:55.417 回答