code: @SuppressWarnings("WeakerAccess")
    public ApiFuture<Table> modifyFamiliesAsync(ModifyColumnFamiliesRequest request) {
      return transformToTableResponse(
          this.stub
              .modifyColumnFamiliesCallable()
              .futureCall(request.toProto(projectId, instanceId)));
    }
docs: Asynchronously creates, updates and drops ColumnFamilies as per the request.
  
  <p>Sample code:
  
  <pre>{@code
  ApiFuture<Table> modifiedTableFuture = client.modifyFamiliesAsync(
  ModifyColumnFamiliesRequest.of(tableId)
  .addFamily("cf1")
  .addFamily("cf2", GCRULES.maxAge(Duration.ofSeconds(1000, 20000)))
  .updateFamily(
  "cf3",
  GCRULES.union()
  .rule(GCRULES.maxAge(Duration.ofSeconds(100)))
  .rule(GCRULES.maxVersions(1))
  )
  .addFamily(
  "cf4",
  GCRULES.intersection()
  .rule(GCRULES.maxAge(Duration.ofSeconds(2000)))
  .rule(GCRULES.maxVersions(10))
  )
  .dropFamily("cf5")
  );
  
  ApiFutures.addCallback(
  modifiedTableFuture,
  new ApiFutureCallback<Table>() {
  public void onSuccess(Table table) {
  System.out.println("Modified table: " + table.getTableName());
  System.out.println("Resulting families:");
  
  for (ColumnFamily cf : modifiedTable.getColumnFamilies()) {
  System.out.println(cf.getId());
  }
  }
  
  public void onFailure(Throwable t) {
  t.printStackTrace();
  }
  },
  MoreExecutors.directExecutor()
  );
  }</pre>
  
  @see ModifyColumnFamiliesRequest for available options.