Führen Sie die Operation für n zufällige unterschiedliche Elemente aus der Sammlung mithilfe der Streams-API durch.

Ich versuche, mithilfe der Streams-API in Java 8 n eindeutige zufällige Elemente zur weiteren Verarbeitung aus einer Sammlung abzurufen, ohne jedoch viel oder kein Glück zu haben.

Mehr genau würde ich so etwas wollen:

Set<Integer> subList = new HashSet<>();
Queue<Integer> collection = new PriorityQueue<>();
collection.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9));
Random random = new Random();
int n = 4;
while (subList.size() < n) {
  subList.add(collection.get(random.nextInt()));
}
sublist.forEach(v -> v.doSomethingFancy());

Ich möchte es so effizient wie möglich machen.

Kann das gemacht werden?

edit: Mein zweiter Versuch - obwohl nicht genau das, wonach ich gesucht habe:

List<Integer> sublist = new ArrayList<>(collection);
Collections.shuffle(sublist);
sublist.stream().limit(n).forEach(v -> v.doSomethingFancy());

edit: Dritter Versuch (inspiriert von Holger), wodurch ein Großteil des Overheads von shuffle entfernt wird, wenn coll.size () sehr groß und n klein ist:

int n = // unique element count
List<Integer> sublist = new ArrayList<>(collection);   
Random r = new Random();
for(int i = 0; i < n; i++)
    Collections.swap(sublist, i, i + r.nextInt(source.size() - i));
sublist.stream().limit(n).forEach(v -> v.doSomethingFancy());

Antworten auf die Frage(14)

Ihre Antwort auf die Frage