我认为最优雅的方式是有一个特殊的收藏家。
我很确定,您可以保证每个项目都有平等的机会被选中的唯一方法是收集,随机播放和重新流式传输。这可以使用内置的 Collectors.collectingAndThen(...) 帮助程序轻松完成。
通过随机比较器排序或使用随机化约器进行排序,就像其他一些答案所建议的那样,将导致非常偏倚的随机性。
List<String> wordList = sourceWords.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(), collected -> {
Collections.shuffle(collected);
return collected.stream();
}))
.limit(listSize)
.collect(Collectors.toList());
您可以将该随机收集器移动到帮助程序函数:
public class CollectorUtils {
public static <T> Collector<T, ?, Stream<T>> toShuffledStream() {
return Collectors.collectingAndThen(Collectors.toList(), collected -> {
Collections.shuffle(collected);
return collected.stream();
});
}
}
我假设您正在寻找一种与其他流处理功能很好地集成的方法。因此,遵循简单的解决方案不是您要寻找:)
Collections.shuffle(wordList)
return wordList.subList(0, limitSize)