Spring Elasticsearch能否通过一行代码批量保存多索引文档?
可以优化为一行调用实现多类型批量保存
当然可以,有两种常见方式实现一行代码完成多列表、多索引的批量更新操作:
方式1:封装通用批量处理方法(推荐,可读性+复用性更强)
先在当前类中封装一个通用方法,统一处理不同类型的列表与实体类的对应关系:
// Java 16+可用record定义批量项,类型更清晰 private record BulkUpdateItem(List<?> dataList, Class<?> entityClass) {} private void batchProcessUpdates(List<BulkUpdateItem> updateItems) { updateItems.forEach(item -> this.operations.bulkUpdate(item.dataList(), item.entityClass())); }
原方法即可简化为一行调用:
public void bulkCreateOrUpdate(List<Person> personUpdateList, List<Address> addressUpdateList, List<Position> positionUpdateList) { batchProcessUpdates(List.of(new BulkUpdateItem(personUpdateList, Person.class), new BulkUpdateItem(addressUpdateList, Address.class), new BulkUpdateItem(positionUpdateList, Position.class))); }
方式2:直接用流式操作一行完成(无需额外方法)
如果不想额外封装方法,也可以通过Stream链式调用直接在一行内完成所有操作:
public void bulkCreateOrUpdate(List<Person> personUpdateList, List<Address> addressUpdateList, List<Position> positionUpdateList) { Stream.of(Map.entry(personUpdateList, Person.class), Map.entry(addressUpdateList, Address.class), Map.entry(positionUpdateList, Position.class)).forEach(entry -> this.operations.bulkUpdate(entry.getKey(), entry.getValue())); }
注意事项
- 建议给List加上具体泛型(如
List<Person>),避免编译器警告并提升类型安全性; - 若Java版本低于16,可将
record替换为AbstractMap.SimpleEntry来承载列表与实体类的对应关系。
内容的提问来源于stack exchange,提问作者Java2Avaj
相关产品推荐
相关产品推荐

