Java 使用lambda创建包含空对象的ArrayList

Java 使用lambda创建包含空对象的ArrayList,java,arraylist,lambda,java-8,java-stream,Java,Arraylist,Lambda,Java 8,Java Stream,我想使用streams创建一个包含id和空列表的对象的ArrayList。我尝试了不同的方法,但没有成功。如果有人能给我一些点击,将会对我有很大帮助。 下面是我想转换为Java 8的代码: this.registers = new ArrayList<Supplier>(); for (int i = 0; i < this.numberOfSuppliers; i++) { Supplier supplier = new Supplier();

我想使用streams创建一个包含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);
    }
this.registers=new ArrayList();
对于(int i=0;i

提前谢谢。

这不是我喜欢的方法(我认为for循环在这里很好),但在streams中,您可以这样做:

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());
this.registers=IntStream.range(0,this.numberOfSuppliers)
.map(i->{
供应商=新供应商();
供应商。设置供应商编号(i);
supplier.setMaterials(新ArrayList());
退货供应商;
})
.collect(Collectors.toList());

您可以考虑将一个构造函数添加到供应商,将ID作为参数,并初始化材料列表,这样就不必暴露SETER。然后,使用循环或流的解决方案变得简单得多

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
{
}
public void buildSuppliersWithLoop()
{
ArrayList寄存器=新的ArrayList()
int numberOfSuppliers=100;
对于(int i=0;i
警告:这将创建一个
列表
,而不是
数组列表
。如果需要
ArrayList
,请将
Collectors.toList()
替换为
Collectors.toCollection(ArrayList::new)
。我认为您需要在此处使用mapToObj,而不是map,因为map返回一个IntStream,不是流。您还可以将供应商对象的创建提取到其他方法以提高可读性。除非这只是流中的练习,否则不要转换为流。
for
循环的性能很好。通过转换为流,您将一无所获,甚至连代码的清晰性和简单性都得不到。在我看来,它实际上不那么干净/简单(参见)。是的,这只是一个练习。但谢谢你的建议:)