2014-05-19 12 views
5

Voglio creare una lista (o una raccolta in generale) chiamando un metodo x volte. In Python sarebbe qualcosa di simile.Come generare un elenco di durata specificata in Java 8?

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

ho cercato di codificare qualcosa di simile in JDK 8.

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

Funziona, ma in qualche modo non si sente allright. C'è un modo più corretto di farlo?

+1

I due scatta codice Python non sono equivalenti, si sta replicando lo stesso riferimento 'length' volte , l'altro sta creando oggetti 'length' (assumendo' generate() 'crea un nuovo oggetto per ogni chiamata) – amit

+0

Sì, è vero se self.generate sta restituendo riferimenti. Inizialmente, restituisce i float, rendendo equivalenti i frammenti. Comunque, è il primo caso che mi interessa. –

risposta

8

Io non sono Python sviluppatore così che io possa capito male il tuo esempio, ma a giudicare da esempio Java potrebbe essere alla ricerca di qualcosa di simile

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

Ma, come Brian Goetz mentioned vostro approccio

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

si esibiranno in modo significativo meglio in parallelo.

+0

Sì! Questo è esattamente quello che stavo cercando. –

+3

Sia questo che l'orientato alla portata faranno il lavoro. Tuttavia, la gamma orientata si esibirà in modo significativamente migliore in parallelo. –

+0

Cosa succede se questo :: generate richiede un argomento? Questo è il mio caso. –

2

Non so se questo si sentirebbe meglio a voi, ma qui è un modo per ottenere lo stesso effetto:

Integer[] arr = new Integer[length]; 
Arrays.setAll(arr, n -> this.generate()); 
List<Integer> l = Arrays.asList(arr); 
Problemi correlati