【问题标题】:Create an ArrayList with empty objects using lambda使用 lambda 创建一个包含空对象的 ArrayList
【发布时间】:2017-07-24 22:38:23
【问题描述】:

我想使用流创建具有 id 和空列表的对象的 ArrayList。我尝试了不同的方法,但没有接缝起作用。如果有人能给我一些点击,将对我有很大帮助。 这是我要转换为 Java 8 的代码:

    this.registers = new ArrayList<Supplier>();
    for (int i = 0; i < this.numberOfSuppliers; i++) {
        Supplier supplier = new Supplier();
        supplier.setSupplierNumber(i);
        supplier.setMaterials(new ArrayList<Warehouse>());
        this.registers.add(supplier);
    }

提前谢谢你。

【问题讨论】:

  • 除非这只是 Streams 中的练习,否则不要转换为 Streams。 for 循环很好。通过转换为 Streams,您将一无所获,甚至代码的清晰度或简单性都不会。在我看来,它实际上会不那么干净/简单(参见answer)。
  • 是的,这只是一个练习。不过谢谢你的建议:)

标签: java arraylist lambda java-8 java-stream


【解决方案1】:

这不是我的首选方法(我认为这里的 for 循环很好),但在流中你可以这样做:

this.registers = IntStream.range(0, this.numberOfSuppliers)
         .map(i -> {
                       Supplier supplier = new Supplier();
                       supplier.setSupplierNumber(i);
                       supplier.setMaterials(new ArrayList<Warehouse>());
                       return supplier;
         })
         .collect(Collectors.toList());

【讨论】:

  • 警告: 这会创建一个List&lt;Supplier&gt;,而不是ArrayList&lt;Supplier&gt;。如果需要ArrayList,请将Collectors.toList() 替换为Collectors.toCollection(ArrayList&lt;Supplier&gt;::new)。
  • 我相信你需要在这里使用 mapToObj,而不是 map,因为 map 返回的是 IntStream,而不是 Stream。
  • 您还可以将 Supplier 对象的创建提取到不同的方法以提高可读性。
【解决方案2】:

您可能会考虑向 Supplier 添加一个构造函数,该构造函数将 id 作为参数,并初始化材料列表,因此您不必公开 setter。然后使用循环或流的解决方案变得更加简单。

public void buildSuppliersWithLoop()
{
    ArrayList<Supplier> registers = new ArrayList<>()
    int numberOfSuppliers = 100;
    for (int i = 0; i < numberOfSuppliers; i++)
    {
        registers.add(new Supplier(i));
    }
}

public void buildSuppliersWithStream()
{
    int numberOfSuppliers = 100;
    List<Supplier> registers = IntStream.range(0, numberOfSuppliers)
            .mapToObj(Supplier::new)
            .collect(Collectors.toList());
}

public class Supplier
{
    private int number;
    private List<Warehouse> materials;

    public Supplier(int number)
    {
        this.number = number;
        this.materials = new ArrayList<>();
    }
}

public class Warehouse
{
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多