2016-04-27 18 views
18

C'è un modo per inizializzare un array o una raccolta utilizzando un'espressione lambda semplice?Espressione lambda per inizializzare l'array

Qualcosa di simile

// What about this? 
Person[] persons = new Person[15]; 
persons =() -> {return new Person()}; 

O

// I know, you need to say how many objects 
ArrayList<Person> persons =() -> {return new Person()}; 

risposta

23

Certo - non so quanto sia utile, ma è certamente fattibile:

import java.util.*; 
import java.util.function.*; 
import java.util.stream.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Supplier<Test> supplier =() -> new Test(); 
     List<Test> list = Stream 
      .generate(supplier) 
      .limit(10) 
      .collect(Collectors.toList()); 
     System.out.println(list.size()); // 10 
     // Prints false, showing it really is calling the supplier 
     // once per iteration. 
     System.out.println(list.get(0) == list.get(1)); 
    } 
} 
+2

Oppure direttamente .generate (() -> nuovo Test()), solo per usare l'operatore lambda richiesto da OP ... preferirebbe utilizzare .generate (Test :: nuovo). –

+6

@ Jean-FrançoisSavard: Sì, stavo solo separando la dichiarazione per mostrare i tipi coinvolti. –

3

Se si desidera inizializzare utilizzando Java 8, non si ha realmente bisogno di usare un'espressione lambda. È possibile ottenere che l'utilizzo Stream:

Stream.of(new Person()).collect(Collectors.toList()); 
+3

I * penso * l'OP vuole chiamare l'espressione lambda più volte per compilare la lista - vedere se la mia risposta ha senso per voi. –

+0

@JonSkeet Ha assolutamente senso. – Maroun

+2

Questo creerà un elenco contenente una singola istanza 'Person', quindi, è un modo complicato di fare lo stesso di' Collections.singletonList (new Person()) ' – Holger

19

Se si dispone già di una matrice pre-assegnati, è possibile utilizzare un'espressione lambda per popolare utilizzando Arrays.setAll o Arrays.parallelSetAll:

Arrays.setAll(persons, i -> new Person()); // i is the array index 

per creare un nuovo array, è possibile utilizzare

Person[] persons = IntStream.range(0, 15) // 15 is the size 
    .mapToObj(i -> new Person()) 
    .toArray(Person[]::new);