2014-05-19 66 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); 
相關問題