用Lambda表达式初始化数组

27

有没有一种方式可以使用简单的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()};
3个回答

33
当然 - 我不知道它有多有用,但它肯定是可行的:
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));
    }
}

3
可以直接使用.generate(Test::new)来替代.generate(() -> new Test()),这样就能满足OP所需的lambda操作符了。注意不要改变原意。 - Jean-François Savard
6
是的,我只是将声明分开以展示所涉及的类型。 - Jon Skeet

29
如果您已经有一个预分配的数组,您可以使用lambda表达式来填充它,使用Arrays.setAllArrays.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进行初始化,您不需要使用lambda表达式。您可以使用Stream来实现:

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

3
我认为OP希望多次调用lambda表达式以填充列表-请看看我的答案是否有意义。 - Jon Skeet
4
这将创建一个包含单个“Person”实例的列表,因此,这是一种复杂的方式来完成与“Collections.singletonList(new Person())”相同的操作。 - Holger
2
@Jean-FrançoisSavard:Collectors.toList()并不保证可变性或不可变性,所以这并不能成为支持此答案的论据。 - user2357112
1
@Jean-François Savard:Collectors.toList() 返回一个未指定的列表类型,因此您无法假设可变性。理论上,对于单个元素结果,它可以返回完全相同的类型。仅在需要不可变性时,singletonList 更可取。 - Holger
1
@Ricola 同意。那时候我还是个孩子。 - Jean-François Savard
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接