Javaの標準ライブラリにタプルデータ構造の実装がないのはなぜだろうか。たとえば、C ++には、この固定サイズの異種値のコレクションの非常に優れた実装があります。Haskellでも同じです。Javaでは、 ()型を介した関数型Javaライブラリでのjavatuplesといくつかのサポートしか知りません。なぜ、あるいは少なくとも標準ライブラリにはまったくないのだろうか?Android SDK開発者でさえ、2タプル(ペア)の独自の実装を追加しました。ProductP1 - P8tuplepair
6 に答える
「Java のやり方」は、この種の軽量なセミクラス型ではなく、用途固有のクラスを定義することです。考えてみれば、タプルは実際には単純化された構造体にすぎません。Java 関係者は、先に進んで構造体を作成することを望んでいます。
Functionこの観点は、特に Java 8 とそのラムダ (のようなユースケース固有のインターフェースではなく、一般的なタイプのインターフェースを提供するように JDK に圧力をかけている) では、少し変化していますFooCallback。しかし、それは多くの Java 開発者にとって依然としてかなり強い考え方であり、それにはある程度の意味があります。Java は非常に静的に型付けされた言語です。タプルは静的型付けと動的型付けの中間に位置します。型システムには、これ(int, String)が顧客 ID を表し、名前が実際には(int, String)注文 ID とその説明を表していると考えるのを妨げるものは何もありません。
たとえば、 Guava プロジェクト内の問題に関するこのディスカッション(「n >= 2 のタプル」) を参照してください。確かに、それは公式ではありません。しかし、これは Java の考え方をよく表しています。
という素敵なライブラリがありますjavatuples。Unit1( ) から 10( ) までのアリティの一般的なタプル型と、、、さらにはDecadeなどのすべての必須メソッドを定義します。equalshashCodetoStringcompareTo
公式サイト: http://www.javatuples.org/
Maven の依存関係:
<dependency>
<groupId>org.javatuples</groupId>
<artifactId>javatuples</artifactId>
<version>[version]</version>
<scope>compile</scope>
</dependency>
(現時点での最新バージョンは1.2)
同僚と私は数週間前にこれについて話し合っていました. 私が思いついた唯一の解決策は、値を a に内部的に格納し、Map<Class, Object>いくつかのアクセサ メソッドを用意することgetValue(Class)でした。それ以外の場合、タプルの値にどのようにアクセスしますか? タプルを作成するとき、これらのメソッドは実行時まで認識されないため、 、 などの各メンバーのメソッドを持つジェネリックTupleクラスを作成することはできません。これは、同じ型を持つ 2 つのメンバーを持つことができないことも意味します。実行時にどのオブジェクトを取得するかを認識できるように、そのようなクラスを作成するにはどうすればよいでしょうか?getIntegergetString
FunctionalJava は、Pこの考えを満たすと思われる (Product) クラスのセットを提供しています。P1-P8最大 8 つの要素タプルを許可します。なぜ彼らが落胆するのかについてのグアバの説明に同意しますが、そこまでです。