Выполните операцию над n случайными отличительными элементами из Collection с помощью API Streams
Я пытаюсь получить n уникальных случайных элементов для дальнейшей обработки из Коллекции, используя API-интерфейс Streams в Java 8, однако без особой удачи.
Точнее я бы хотел что-то вроде этого:
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());
Я хочу сделать это максимально эффективно.
Можно ли это сделать?
редактировать: моя вторая попытка - хотя не совсем то, к чему я стремился:
List<Integer> sublist = new ArrayList<>(collection);
Collections.shuffle(sublist);
sublist.stream().limit(n).forEach(v -> v.doSomethingFancy());
редактировать: третья попытка (вдохновленныйHolger), который удалит большую часть издержек shuffle, если coll.size () огромен, а n мало:
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());