2016-04-27 13 views
18

単純なラムダ式を使って配列やコレクションを初期化する方法はありますか?ラムダ式を使って配列を初期化する

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

それとも

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

答えて

23

確かに - 私はそれがどのように役に立つかわからないが、それは確かになんとかです:

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

または直接.generate(() - > new Test())、単にOPによって要求されたラムダ演算子を使用するには、.generate(Test :: new)を使用します。 –

+6

@ Jean-FrançoisSavard:はい、私は、関連するタイプを示すために宣言だけを分離していました。 –

3

よう

何かは、Java 8を使用して、それを初期化したい場合は、あなたが本当にラムダ式を使用する必要はありません。あなたはStreamを使用していることを達成することができます:

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

* * OPはラムダ式を複数回呼び出してリストを作成したいと思っています - 私の答えがあなたに合っているかどうかを見てください。 –

+0

@JonSkeet完全に意味があります。 – Maroun

+2

これは、単一の 'Person'インスタンスを含むリストを作成するので、' Collections.singletonList(new Person()) 'と同じようにする複雑な方法です。 – Holger

19

すでに事前に割り当てられた配列を持っている場合は、することができますArrays.setAllまたはArrays.parallelSetAllを使用して、それを埋めるために、ラムダ式を使用します。

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

新しいアレイを作成するには、

を使用することができます
Person[] persons = IntStream.range(0, 15) // 15 is the size 
    .mapToObj(i -> new Person()) 
    .toArray(Person[]::new);