如何将构建器模式与 vargs 一起使用?

How to use a builder pattern with vargs?

假设我有 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 =,但这样您就不会对构建器是否返回相同实例做出任何假设。

您可以使用流来执行此操作,但鉴于要求,我认为这是不必要的:

FooBuilder builder = Foo.builder();
Arrays.stream(attributes)
        .forEach(builder::attribute);
return builder.build();

如果您需要使用其他一些 intermediate/filter 方法,我只会推荐使用流。否则您可能正在创建不必要的分配。您也无法 update/reassign 构建器变量,除非您使用 AtomicReference 或单元素数组:

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

恶心。