【问题标题】:Lambda expression to initialize array初始化数组的 Lambda 表达式
【发布时间】:2016-04-27 09:14:46
【问题描述】:

有没有办法通过使用简单的 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()};

【问题讨论】:

    标签: java lambda java-8


    【解决方案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));
        }
    }
    

    【讨论】:

    • 或者直接.generate(() -> new Test()),只是为了使用OP要求的lambda运算符...宁可使用.generate(Test::new)。
    • @Jean-FrançoisSavard:是的,我只是将声明分开以显示所涉及的类型。
    【解决方案2】:

    如果您已经有一个预分配的数组,您可以使用 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());
      

      【讨论】:

      • 认为 OP 想要多次调用 lambda 表达式来填充列表 - 看看我的回答是否对你有意义。
      • @JonSkeet 完全有道理。
      • 这将创建一个包含单个Person 实例的列表,因此,与Collections.singletonList(new Person()) 执行相同操作是一种复杂的方法
      • @Holger singletonList 返回一个不可变列表。
      • @Jean-FrançoisSavard:Collectors.toList() 不保证可变性或不变性,所以这并不是支持这个答案的真正意义。
      猜你喜欢
      • 2016-08-22
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2018-01-14
      • 2022-01-19
      相关资源
      最近更新 更多