我正在将一个程序从 C# 翻译成 Java。在 C# 代码中,开发人员使用元组。我需要将此 C# 代码翻译成 Java 代码。因此,Java 是否具有与 C# 的元组等效的变量类型?
10 回答
由于类型擦除,Java 中无法准确地镜像 .NET 中的各种Tuple
类。但是,这是一个 BSD 许可的 Java 实现Tuple2
和Tuple3
,它反映了.NET 的Tuple<T1, T2>
和Tuple<T1, T2, T3>
类型。
- Tuple.java(使用类型推断构造元组的静态方法)
- 元组2.java
- 元组3.java
您可以在 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());
可能有点跑题了,但是您是否考虑过在 JVM 环境中使用 Scala?它具有元组支持 + 一些您可能会从 C# 中错过的其他不错的功能。
在https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/package-summary.html似乎有一个相当不错的元组库。三个元素是最大的,但如果你需要一个大于三个的元组,你可能应该放弃并定义一个类。
这是一个相当老的话题,但我会留下我最近在 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
我在我的 android 项目中也需要 Tuple 等价物,但在 Java 中没有找到任何本机解决方案。但令人惊讶的是Pair.class
,在 android 的 util 中,这正是我正在寻找的。
因此,遇到这个问题的Android 开发人员Pair.class
在package.json 中使用android.util
。
PS我很难过接受 Java 在很多方面已经远远落后于其他语言。
据我所知,可能有实现,但不在 JDK 库中。有关您自己的元组的示例,请参见此处:Using Pairs or 2-tuples in Java
当您将 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 等类型。
这是一个相当古老的问题,但这是我最终开发的能够在后 Java 8 世界中使用元组的所有功能工具和更好的流利语言:https ://github.com/mmnaseri/tuples4j /
它也已经在 Maven Central 中可用,因此很容易掌握。
从一开始,Java 中至少存在一个 2-tupel java.util.Map.Entry<K,V>
:!好吧,它只是一个界面……</p>
但是从 Java 9 开始,有一个静态方法java.util.Map.entry()
允许动态创建该接口的实例(实际上,实现该接口的隐藏类的实例,但谁在乎这个小细节呢?)。
我不想在不处理集合的公共 API 的定义中使用它,而是在内部实用程序类中使用它……为什么不呢?该类已经存在于 JRE 中,没有额外的外部依赖,而且我可以接受这样一个事实,即元素被命名为“key”和“value”而不是“item1”、“item2”……</p>
我不是 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>
而且它真的只适合在地图中使用