将生成的流保存到ArrayList中

4
我需要创建一个由 stream.generate 生成的随机数的 ArrayList。下面的代码是我尝试将其保存到 ArrayList 中的方式,但它是“object”类型。我想我必须先将其映射为 int,但我不知道如何做。目前的代码无法运行。
public ArrayList<Integer> createRandomList(ArrayList<Integer> list, int amount) {
     ArrayList<Integer> a = Arrays.asList(Stream.generate(new Supplier<Integer>() {
                    @Override
                    public Integer get() {
                        Random rnd = new Random();
                        return rnd.nextInt(100000);
                    }
                }).limit(amount).mapToInt.toArray());
}
2个回答

7

您可以直接使用ints(...)Random对象创建int流,使用boxed()使其装箱,并使用收集器存储结果:

return new Random().ints(amount, 0, 100000)
                   .boxed()
                   .collect(Collectors.toCollection(ArrayList::new));

1
如果操作员坚持之后要有一个 ArrayList,可以使用 .collect(Collectors.toCollection(ArrayList::new))。也许您想补充一下这一点。 - Holger
@Holger:已更新,谢谢。 - Tagir Valeev

3
您可以使用收集器:
return Stream.generate (() -> new Random().nextInt(100000))
             .limit(amount)
             .collect (Collectors.toList());

这将生成一个 List<Integer>,但不一定是 ArrayList<Integer>。更有意义的做法是创建一个单独的随机实例:
final Random rnd = new Random();
return Stream.generate (() -> rnd.nextInt(100000))
             .limit(amount)
             .collect (Collectors.toList());

2
好的,collect操作究竟是做什么的? - Jan
1
@taclight 它使用提供的 Collector 收集 Stream 的元素。Collectors.toList() 是一个 Collector,它创建一个 List 实例,将所有 Stream 元素添加到其中,并返回该 List。 - Eran
1
它如何知道列表中的元素应该是哪种类型? - Jan
在我的第一次尝试中,它告诉我流创建的元素是对象类型,现在有什么不同吗? - Jan
2
首先,mapToInt 应该改为 mapToInt(Integer::intValue)。现在,toArray() 会生成一个 int[] 数组。然后你将它传递给 Arrays.asList,这将创建一个 Arrays$ArrayList<int[]>,而不是你预期的 ArrayList<Integer> - Eran
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接