IntStream
とlambdasを使って素早く(1行で)既存の要素配列のランダムな部分集合を含む配列を作成できるかどうかは疑問です。例えばIntreamを使用して配列のランダムなサブセットを作成する簡単な方法
は、私は選手たちのプール持っていると言う:
Player[] allPlayers;
を私は必要なサブセットの寸法を与えられ、それらのプレーヤーのランダムなサブセットを取得したいです。伝統的に私は次のようなことをします:
List<Player> players = new ArrayList<Player>(Arrays.asList(allPlayers));
int subsetSize = 8;
Player[] subset = new Player[subsetSize];
for (int i = 0; i < subsetSize; i++) {
int randIndex = new Random().nextInt(players.size());
subset[i] = players[randIndex];
players.remove(randIndex);
}
return subset;
しかし、このプロセスはJava 8の機能で実行できますか?私はこれをより凝縮させると思いますが、それは私が達成しようとしているものです。私はまだIntStream
とlambdasのようなこれらの新しいJava 8機能のハングアップを取得しており、この特定のケースでそれらを使用する方法はわかりません。
これはうまく見えますが、私はこの戦略が最適ではないと感じます。たとえば、サイズが1000の場合、999要素のサブセットが必要な場合は、まだ生成されていないものを見つけるまで、非常に多くの乱数を生成する必要があります。 Collections.shuffleにはこの問題はありません。小さなサブセットの場合は、おそらくもっと速いでしょう。 –
美しい、これは私が探していたものです。私は本当にラムダの可能性を使用し始める必要があります。 Btw、ここで 'mapToObj'がどのように動作するのか気になりますか? – dabadaba