簡體   English   中英

Java 是否具有與 C# 元組等效的變量類型?

[英]Does Java have an equivalent variable type to C#'s Tuple?

我正在將程序從 C# 翻譯成 Java。 在 C# 代碼中,開發人員使用 Tuple。 我需要將此 C# 代碼轉換為 Java 代碼。 因此,Java 是否具有與 C# 的元組等效的變量類型?

由於類型擦除,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());

可能有點題外話,但是您是否考慮過在 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 中找到任何本機解決方案。 但令人驚訝的是,android 的 util 中有Pair.class ,這正是我正在尋找的。

所以遇到這個問題的Android 開發者使用android.util包中的Pair.class

PS我很傷心,接受,有很多東西,Java是遠遠落后於其他語言了。

可能有實現,但據我所知不在 JDK 庫中。 有關您自己的元組的示例,請參見此處: 在 Java 中使用 Pairs 或 2-tuples

當您將 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> 好吧,它只是一個界面……

但是從 Java 9 開始,有靜態方法java.util.Map.entry()允許動態創建該接口的實例(實際上,實現該接口的隱藏類的實例,但誰在乎那一點細節?)。

我不想在不處理集合的公共 API 的定義中使用它,而是用於內部實用程序類......為什么不呢? 這個類已經存在於 JRE 中,沒有額外的外部依賴,我可以接受這樣一個事實,即元素被命名為“key”和“value”而不是“item1”、“item2”……

我不是 C# 開發人員,但鑒於我剛剛查看的有關 C# 中的元組的文檔,我無法想象您會/可以/應該使用這樣的東西。

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

看着這段代碼,我對這些值代表什么一無所知,也無法想象為什么不使用類。

在我看來,這只是代表了糟糕的封裝。

但是,如果您想要 Java 中的元組,我所知道的唯一一個是

Map.Entry<K,V>

而且它真的只適合在 Maps 中使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM