code: public ApiFuture<Row> readRowAsync(String tableId, String rowKey, @Nullable Filter filter) {
      return readRowAsync(tableId, ByteString.copyFromUtf8(rowKey), filter);
    }
docs: Convenience method for asynchronously reading a single row. If the row does not exist, the
  future's value will be null.
  
  <p>Sample code:
  
  <pre>{@code
  try (BigtableDataClient bigtableDataClient = BigtableDataClient.create("[PROJECT]", "[INSTANCE]")) {
  String tableId = "[TABLE]";
  
  // Build the filter expression
  Filters.Filter filter = FILTERS.chain()
  .filter(FILTERS.qualifier().regex("prefix.*"))
  .filter(FILTERS.limit().cellsPerRow(10));
  
  ApiFuture<Row> futureResult = bigtableDataClient.readRowAsync(tableId, "key", filter);
  
  ApiFutures.addCallback(futureResult, new ApiFutureCallback<Row>() {
  public void onFailure(Throwable t) {
  if (t instanceof NotFoundException) {
  System.out.println("Tried to read a non-existent table");
  } else {
  t.printStackTrace();
  }
  }
  public void onSuccess(Row row) {
  if (result != null) {
  System.out.println("Got row: " + result);
  }
  }
  }, MoreExecutors.directExecutor());
  }
  }</pre>