使用字段名称列表和相同模式构建Avro模式

时间:2020-03-12 12:25:51

标签: java java-stream avro

在为我的问题找到解决方案时遇到问题。

我需要在struct()和build()方法之间调用field方法x次以创建一个新对象。这是一种构建器模式。

Schema people = SchemaBuilder.struct()
                .field("NAME", Schema.STRING_SCHEMA)
                .field("SURNAME", Schema.STRING_SCHEMA)
                .field("CITY", Schema.STRING_SCHEMA)
                .build();

但是在我的情况下,人员架构的字段不是从一开始就定义的。它们需要可变。我需要类似的东西:

String[] values = {"NAME", "SURNAME", "CITY", "FIELD4", "FIELD5", .....};

Schema people = SchemaBuilder.struct()
          .xTimes.field(values[x], Schema.STRING_SCHEMA))
          .build();

我查看了Streams和lambda,但从未与它们合作,并且不确定是否可以解决这种情况。我无法中断这些方法。它们都需要在一行中被调用。 我正在尝试做的事情甚至可能吗?如果可以,怎么办?

谢谢

编辑: 这是我尝试过但没有起作用的方法:

public Schema buildSchema(String... fields){
  sch1 = SchemaBuilder.struct();
  for (int i = 0; i < fields.length; i++) {
    sch1 =SchemaBuilder.struct().field(fields[i], Schema.STRING_SCHEMA);
  }
  return sch1;
}

这很好用,但是不符合我的需求:

public Schema buildSchema(){
  Schema sch1 = SchemaBuilder.struct()
    .field("foo", Schema.STRING_SCHEMA)
    .field("bar", Schema.STRING_SCHEMA)
    .field("duck", Schema.STRING_SCHEMA)
    .build();
  return sch1
}

1 个答案:

答案 0 :(得分:3)

String[] values = {"NAME", "SURNAME", "CITY", "FIELD4", "FIELD5", .....};

SchemaBuilder builder = SchemaBuilder.struct();
for (int i = 0; i < values.length; i++) {
    builder = builder.field(values[i], Schema.STRING_SCHEMA)
}
Schema people = builder.build();

如何回弹类似的东西?