Java有与C#的元组等效的变量类型吗?

时间:2013-04-24 16:13:13

标签: java c# .net tuples

我正在将程序从C#转换为Java。在C#代码中,开发人员使用Tuple。我需要将这个C#代码翻译成Java代码。因此,Java是否具有与C#的元组等效的变量类型?

10 个答案:

答案 0 :(得分:3)

由于类型擦除,Java中无法使用.NET中各种Tuple类的精确镜像。但是,这是针对Java的Tuple2Tuple3的BSD许可实现,它反映了.NET中的Tuple<T1, T2>Tuple<T1, T2, T3>类型。

你可以用Java做一件很酷的事情而不是C#:

class Bar extends Foo { }

...

Tuple2<? extends Foo, ? extends Foo> tuple = Tuple.create(new Bar(), new Bar());

在C#中,您必须使用强制转换:

Tuple<Foo, Foo> tuple = Tuple.Create((Foo)new Bar(), (Foo)new Bar());

答案 1 :(得分:1)

可能有点偏离主题,但您是否在JVM环境中考虑过Scala?它有元组支持+一些其他很好的功能,你可能会错过C#。

答案 2 :(得分:1)

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/package-summary.html似乎有一个相当不错的Tuple库。三个元素是最大的元素,但如果你需要一个大于三的元组,你应该放弃并定义一个类。

答案 3 :(得分:1)

这是一个非常古老的主题,但我会留下我最近在Java项目中转换C#元组(Tuple)时使用的内容 - 你可以简单地使用org.javatuples lib - https://www.javatuples.org/,这将给出与存储数据相同的行为。

以下简单示例适用于稍后会查看此内容的人:

C#

pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]The identifier that starts with ''190/TEMP.AA1H', '190/RAIN.AA1H', '190/WDR.AA1H', '190/WSP.AA1H', '190/SD1.AA1H', '190/HUMID.AA1H', '190/NO2.AA1H', '190/PM10.AA' is too long. Maximum length is 128. (103) (SQLExecDirectW)")

与Java相同

var tupleCs = new Tuple<string, string, string>("value1","value2","value3");
Console.Writeline(tupleCs.Item1); => value1
Console.Writeline(tupleCs.Item2); => value2
Console.Writeline(tupleCs.Item3); => value3

答案 4 :(得分:1)

我的android项目中也需要Tuple等效项,但没有在Java中找到任何本机解决方案。但是令人惊讶的是,Android的util中有Pair.class正是我在寻找的东西。

因此遇到此问题的 Android开发人员使用Pair.class包中的android.util

P.S。 我很伤心,接受,有很多东西,Java是远远落后于其他语言了。

答案 5 :(得分:0)

据我所知,可能有实现,但JDK库中没有。有关您自己的元组的示例,请参阅此处:Using Pairs or 2-tuples in Java

答案 6 :(得分:0)

当您将Spring Boot与WebFlux一起使用时,它随Project Reactor一起提供,并提供my_fn类。 Project Reactor实施的优点是它们具有使用Tuples运算符生成元组的干净方法

例如

.of

我通常将其用于日期范围,如本示例中所示,以找到给定处理日期的范围的开始日期。

Tuples.of("A", 1, myObject);

无需记住配对,三重,十进位等类型。

答案 7 :(得分:0)

这是一个相当老的问题,但这是我最终开发的,能够在后Java 8世界中使用其所有功能工具和更好的流利语言来使用元组:https://github.com/mmnaseri/tuples4j/

它已经在Maven Central中可用,因此很容易掌握。

答案 8 :(得分:0)

从一开始就在Java中至少有2个Tupel:java.util.Map.Entry<K,V>!好的,它只是一个接口……

但是从Java 9开始,有一个静态方法java.util.Map.entry()允许动态创建该接口的实例(实际上,隐藏类的实例实现了该接口,但是谁在乎这些细节? ?)。

我不想在不处理Collections而是用于内部实用程序类的公共API的定义中使用它……为什么不呢?该类已经存在于JRE中,没有其他外部依赖关系,我可以忍受这样的事实,即元素被命名为“键”和“值”,而不是“ item1”,“ item2”,……

答案 9 :(得分:-1)

我不是C#开发人员,但考虑到我刚刚在C#中看到Tuple的文档,我无法想象你会/可能/应该使用这样的东西。

var population = new Tuple<string, int, int, int, int, int, int>(
                           "New York", 7891957, 7781984, 
                           7894862, 7071639, 7322564, 8008278);

看看这段代码,我不知道这些值代表什么,也无法想象为什么你不会使用一个类。

正如我所看到的,这只是代表了不良的封装。

但是,如果你想要一个Java中的元组,我唯一知道的是

Map.Entry<K,V>

它真的只适合在地图中使用