2014-05-19 65 views
5

我想通过调用x次来创建一个列表(或一般的集合)。在Python中,它会是这样的。如何在Java 8中生成给定长度的列表?

self.generated = [self.generate() for _ in range(length)] 

我试图在JDK 8

this.generated = IntStream.range(0, length) 
          .mapToObj(n -> this.generate()) 
          .collect(Collectors.toList()); 

它的工作原理编写类似的东西,但不知何故,没有感觉还好吧。有没有更正确的方法呢?

+1

两个Python代码卡扣是不等价的,一个是复制相同的参考'length'倍,另一个是创建'length'对象(假设'generate()'为每个调用创建一个新对象) – amit

+0

是的,如果self.generate返回引用,则为true。最初,它已经返回浮动,使得片段相当。不过,这是我感兴趣的第一个案例。 –

回答

8

我不是Python的开发人员,所以我可能会误解你的榜样,但是从Java例子来看,你可能会寻找类似

Stream.generate(this::generate).limit(length).collect(Collectors.toList()); 

但作为Brian Goetz mentioned你的方法

IntStream.range(0, length).mapToObj(i->...) 

将显著执行并行更好。

+0

是啊!这正是我所期待的。 –

+3

这个和范围导向的人都会做这个工作。然而,以范围为导向的那个将会更好地并行执行。 –

+0

如果this :: generate需要参数会怎么样?这是我的情况。 –

2

不知道这是否会觉得有什么更好的给你,但这里得到同样的效果的一种方法:

Integer[] arr = new Integer[length]; 
Arrays.setAll(arr, n -> this.generate()); 
List<Integer> l = Arrays.asList(arr); 
相关问题