Подтвердить что ты не робот

Выражение Lambda для инициализации массива

Есть ли способ инициализировать массив или коллекцию с помощью простого выражения лямбда?

Что-то вроде

// 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()};
4b9b3361

Ответ 1

Конечно - я не знаю, насколько это полезно, но это, безусловно, возможно:

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

Если у вас уже есть предварительно выделенный массив, вы можете использовать выражение лямбда для его заполнения с помощью 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);

Ответ 3

Если вы хотите инициализировать его с помощью Java 8, вам не нужно использовать выражение лямбда. Вы можете достичь этого, используя Stream:

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