配列をイテレータに変換するにはどうすればよいですか?

参照型の配列がある場合、最も簡単な方法はそれをリストに変換することです。 ここに新しい何もない:

MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();

あなたがプリミティブの配列を持っている場合、困難が発生します。 配列がintの場合、それをArrays.asList()に渡してもList<Integer>にはなりません。 代わりに、あなたはList<int>を取得しますが、これはおそらくあなたが望むものではありません!この場合のIteratorの問題は、プリミティブではなく参照型の要素のみを反復処理できることです。 プリミティブ配列からボックス化されたプリミティブのイテレータを作成することができます(少なくともintlong、およびdoubleの通常のトリオから)。:

int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();

このイテレータは通常の方法で使用できます。 ただし、next()へのすべての呼び出しは、プリミティブ値をボックス化してしまい、オーバーヘッドが発生することに注意してください。 イテレータ-スタイルの構造体を使用したいが、ボクシングのオーバーヘッドを避けたい場合は、Java8で導入された新しいプリミティブ-イテレータを使用で IntStreamなどのプリミティブストリームによって返されるイテレータは、Iterator<Integer>と新しいPrimitiveIterator.OfIntの両方であることがわかります。 この新しいイテレータには、ボックス化せずにイテレータからint値を返すメソッドnextInt()があります。 それは次のように使用することができます:

PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}

同様のnextLong()およびnextDouble()メソッドを持つlongおよびdoubleイテレータにも同じことが適用されます。

プリミティブ配列をプリミティブストリームに変換することは、おそらくほとんどのユースケースを満たします。 ただし、これらの代替メカニズムは、必要に応じて長年の反復子スタイルの構造体を作成できるようにするために存在します。

コメントを残す

メールアドレスが公開されることはありません。