11

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

4

10 回答 10

5

由于类型擦除,Java 中无法准确地镜像 .NET 中的各种Tuple类。但是,这是一个 BSD 许可的 Java 实现Tuple2Tuple3,它反映了.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());
于 2013-04-24T16:39:46.957 回答
1

可能有点跑题了,但是您是否考虑过在 JVM 环境中使用 Scala?它具有元组支持 + 一些您可能会从 C# 中错过的其他不错的功能。

于 2013-04-24T16:49:27.680 回答
1

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

于 2017-04-11T23:52:18.140 回答
1

这是一个相当老的话题,但我会留下我最近在 Java 项目中转换 C# tuples(Tuple) 期间使用的内容 - 你可以简单地使用 org.javatuples lib - https://www.javatuples.org/,它会给出相同的存储数据的行为。

下面的简单示例供稍后将查找此内容的人使用:

C#

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

在 Java 中也一样

Triplet tupleJava = new Triplet("value1","value2","value3");
System.out.println(tupleJava.getValue0()); => value1 
System.out.println(tupleJava.getValue1()); => value2
System.out.println(tupleJava.getValue2()); => value3
于 2018-02-26T00:27:30.570 回答
1

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

因此,遇到这个问题的Android 开发人员Pair.class在package.json 中使用android.util

PS我很难过接受 Java 在很多方面已经远远落后于其他语言。

于 2020-01-14T13:32:14.907 回答
0

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

于 2013-04-24T16:14:47.930 回答
0

当您将 Spring Boot 与 WebFlux 一起使用时,它带有 Project Reactor 并提供Tuples类。Project Reactor 实现的优点是它们有一种使用.of运算符生成元组的干净方式

例如

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

我通常将它用于此示例中所示的日期范围,以查找给定处理日期的范围的开始日期。

return schedules.stream()
   .map(s -> Tuples.of(s.getStartDate(), s.getStopDate().orElse(LocalDate.MAX)))
   .filter(range -> (!processingDate.isBefore(range.getT1())) && 
                      processingDate.isBefore(range.getT2()))
   .findAny()
   .map(Tuple2::getT1);

无需记住 Pair、Triple、Decade 等类型。

于 2020-05-08T20:45:42.570 回答
0

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

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

于 2020-05-12T06:48:21.177 回答
0

从一开始,Java 中至少存在一个 2-tupel java.util.Map.Entry<K,V>:!好吧,它只是一个界面……</p>

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

我不想在不处理集合的公共 API 的定义中使用它,而是在内部实用程序类中使用它……为什么不呢?该类已经存在于 JRE 中,没有额外的外部依赖,而且我可以接受这样一个事实,即元素被命名为“key”和“value”而不是“item1”、“item2”……</p>

于 2020-05-12T07:09:44.840 回答
-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>

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

于 2013-04-24T16:58:34.723 回答