2016-04-27 13 views
18

Gibt es eine Möglichkeit, ein Array oder eine Sammlung mit einem einfachen Lambda-Ausdruck zu initialisieren?Lambda-Ausdruck zum Initialisieren des Arrays

So etwas wie

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

Oder

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

Antwort

23

Sicher - ich weiß nicht, wie nützlich es ist, aber es ist sicherlich machbar: Sie können das Stream mit erreichen

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

Oder direkt .generate (() -> new Test()), nur um den von OP angeforderten Lambdaoperator zu verwenden ... würde lieber .generate (Test :: new) verwenden. –

+6

@ Jean-FrançoisSavard: Ja, ich habe nur die Deklaration getrennt, um die beteiligten Typen zu zeigen. –

3

Wenn Sie es mit Hilfe von Java 8 initialisieren möchten, brauchen Sie nicht wirklich einen Lambda-Ausdruck zu verwenden.

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

Ich * denke * das OP möchte den Lambda-Ausdruck mehrmals aufrufen, um die Liste zu füllen - sehen Sie, ob meine Antwort für Sie sinnvoll ist. –

+0

@JonSkeet Total macht Sinn. – Maroun

+2

Dies wird eine Liste erstellen, die eine einzelne "Person" -Instanz enthält, also ist es eine komplizierte Art, dasselbe zu tun wie "Collections.singletonList (new Person())" – Holger

19

Wenn Sie bereits eine vorab zugewiesene Array haben, können Sie einen Lambda-Ausdruck verwenden, um es zu füllen Arrays.setAll oder Arrays.parallelSetAll mit:

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

ein neues Array zu erstellen, können Sie verwenden

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