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

Java中的元组(异构元素的不可修改有序列表)支持,java,tuples,Java,Tuples,我想知道为什么Java的标准库中没有元组数据结构实现。例如C++具有固定大小的异构值集合。同样的。在Java中,我只知道通过Product(P1-P8)类型在库中提供一些支持。我想知道为什么tuple或者至少pair根本不在标准库中?甚至安卓SDK开发人员也添加了他们的2元组(成对)组合。它有: Collections.unmodifiableList(yourList) 我会成功的 我认为JCF的多功能性使得显式元组数据结构的存在变得不必要 我假设tuple指的是一个有序的、不可变的元素列表

我想知道为什么Java的标准库中没有元组数据结构实现。例如C++具有固定大小的异构值集合。同样的。在Java中,我只知道通过
Product
P1-P8
)类型在库中提供一些支持。我想知道为什么
tuple
或者至少
pair
根本不在标准库中?甚至安卓SDK开发人员也添加了他们的2元组(成对)组合。

它有:

Collections.unmodifiableList(yourList)
我会成功的

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

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


至于第三方图书馆,我在谷歌上的强力搜索产生了效果,当然。

几周前,我和一位同事讨论了这个问题。我能想到的唯一解决方案是在内部将值存储在
Map
中,并使用一些访问器方法
getValue(Class)
。否则,如何访问元组中的值?您不能有一个通用的
元组
类,该类包含每个成员的方法,例如
getInteger
getString
等,因为这些方法在创建元组时运行时才为人所知。这也意味着你不可能有两个相同类型的成员——你怎么能编写这样一个类,这样在运行时,它就知道要检索哪个对象了?

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

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

这一观点正在发生一些变化,特别是在Java 8及其lambda中(这给JDK带来了压力,要求它提供通用的
函数
类型的接口,而不是像
FooCallback
这样的特定于用例的接口)。但对于许多Java开发人员来说,这仍然是一种相当强烈的思维方式,而且有一定的道理。Java是一种非常静态类型的语言;元组介于静态类型和动态类型之间,因为类型系统中没有任何东西可以阻止您认为表示客户ID和名称的
(int,String)
实际上是表示订单ID及其描述的
(int,String)


例如,请参见有关Guava项目中问题的(“n>=2的元组”)。当然,这不是官方的;但是它很好地代表了Java的思维方式。

有一个很好的库,名为
javatuples
。它定义了从1(
Unit
)到10(
Decade
)的算术的通用元组类型,以及所有基本方法,如
equals
hashCode
toString
甚至
compareTo

官方网站:
Maven依赖项:

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

org.javatuples
Java元组
[版本]
编译

(目前最新版本是
1.2

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


您可以将其用作两个成员的元组,甚至可以应用泛型。如果我需要两个以上的元素,我会认真思考我做错了什么。也许值得一试。

为通用元组命名一个好的用例?一般来说,这些类型的结构不利于类型安全性,大多数情况下可以用集合代替。我知道Drool使用元组,但不是从library@radai有很多。最明显的一点是,不是每次你想把两个或更多不同的东西放在一起都要编写一个类,而是有一个现成的解决方案可以帮你做到这一点。是的,tuple不安全。但在命令式语言中,一切都不安全!那么我们为什么不在商业和企业开发中使用Haskell这样的语言呢?因为我们想要简单的解决方案。番石榴已经明确决定不提供元组类型。可以找到一些解释。我认为番石榴的解释一针见血。任何时候,如果你想把2+个东西放在一起,最好把结果的组合命名为:-)“因为其他语言都有它们”,这是给一种语言添加东西的一个不好的理由。这如何回答这个问题呢?@PaulBellora tuple=unmodifiable listFYI,番石榴的
ImmutableList
被认为比
unmodifiableList
更安全,因为
unmodifiableList
仍然会导致
ConcurrentModificationException
@JoséRobertoAraújoJúnior理解-我读过OP对“异构”的使用在静态和强类型语言中,tuple不仅仅是一个固定大小的列表,因为它的类型包含关于元素类型的信息。所以N元素元组有N个类型参数。列表只有一个类型参数,这意味着每个列表元素都有相同的(编译时)类型。泛型如何解决这个问题<代码>元组tup=新元组()。。。panel.add(tup.getLast());label.setText(tup.getFirst())这显然是一个2元组的强制大小,但是下面有一个对象数组并让程序员负责强制转换是很容易的。在我所有的岁月里,我从来没有发现过这样一种情况:我需要一个元组数据结构,但却没有一个简单的替代方案。所以,当你需要两个以上的元素时,你会怎么做?您不能编写
getSecond
getThird
等。此时您最好只编写
Object[]
。元组结构的长度超过2个