Выражение 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()};
Ответы
Ответ 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());