如何使用流随机选择项目

How to get a random selection of items using streams

如果给它一个随机 int 流,是否有办法从流中随机选择项目(无重复)?

例如,我有一个包含 1000 个小部件的列表,我想从该列表中随机选择 25 个小部件。我可以通过生成随机 int 流(数字从 0 到 999)并将其用于小部件流来实现吗?

您可以按照以下方式进行:

  • 创建随机实例
  • 生成介于 0 和 widgetList.size()-1 之间的值流。
  • 确保它们不重复(disinct)
  • 限制为 25
  • 获取该索引处的小部件
  • 存储在列表中。
List<Widget> widgetList;  // your populated Widget list
Random r = new Random();        
List<Widget> slice =     
    r.ints(0,1000).distinct().limit(25).mapToObj(widgetList::get).toList();

这应该有效。但是如果列表的上限(在本例中为 1000)小于限制(25),它将永远不会终止。

您也可以只打乱列表并取前 25 个。

Collections.shuffle(widgetList);