Java 如何将生成器模式与vargs一起使用?

Java 如何将生成器模式与vargs一起使用?,java,builder,Java,Builder,假设我有一个varargs方法,我正试图构建使用构建器模式的Foo public Foo buildSomething(String... attributes) { return Foo.builder() .attribute(attributes[0]) .attribute(attributes[1]) .attribute(attributes[2]) ... .build() } 显然,这是行不通的。可以用溪流吗 Fo

假设我有一个varargs方法,我正试图构建使用构建器模式的Foo

public Foo buildSomething(String... attributes) {
  return Foo.builder()
      .attribute(attributes[0])
      .attribute(attributes[1])
      .attribute(attributes[2])
      ...
      .build()
}
显然,这是行不通的。可以用溪流吗

FooBuilder builder = Foo.builder();
for (String attribute : attributes) {
    builder = builder.attribute(attribute);
}
return builder.build();
在for循环中调用builder=通常是不必要的,但是通过这种方式,您不会对构建器是否返回相同的实例做出任何假设

您可以使用streams来实现这一点,但鉴于以下要求,我认为这是不必要的:

FooBuilder builder = Foo.builder();
Arrays.stream(attributes)
        .forEach(builder::attribute);
return builder.build();
我只建议在需要使用其他一些中间/过滤方法时使用streams。否则,您可能会创建不必要的分配。除非使用类似AtomicReference或单元素数组的内容,否则也无法更新/重新分配生成器变量:

FooBuilder[] builder = {Foo.builder()};
Arrays.stream(attributes)
        .forEach(a -> {
            builder[0] = builder[0].attribute(a);
        });
return builder.build();

糟糕。

问题通常是基于意见的,因此,什么是最好的方式。你是对的。我修改了我的问题,我投票重新开始这个问题。问题是明确而具体的。问题是询问一个与构建器处理一系列争论的策略。在这种情况下,构建器的好处是什么?将varargs参数传递给Foo的构造函数会更直接。@jaco0646'Foo'可能不是我写的或可以扩展的东西。在我的例子中,Foo是另一个库的一部分attribute方法如何知道哪个属性是哪个?您是否建议编写一个生成器类来跟踪属性方法被调用的次数?如果是的话,我建议在你的回答中解释一下。也许可以给出一些示例代码。你能建议一种使用streams的方法吗?@BasilBourque我假设知道哪些属性是,哪些属性不是需求的一部分。我假设Foo类只是有一个列表属性。@kane我添加了一个关于如何使用streams实现这一点的示例。