code: @Override
    public void deleteObjects(List<StorageResourceId> fullObjectNames) throws IOException {
      logger.atFine().log("deleteObjects(%s)", fullObjectNames);
  
      if (fullObjectNames.isEmpty()) {
        return;
      }
  
      // Validate that all the elements represent StorageObjects.
      for (StorageResourceId fullObjectName : fullObjectNames) {
        Preconditions.checkArgument(
            fullObjectName.isStorageObject(),
            "Expected full StorageObject names only, got: %s", fullObjectName);
      }
  
      // Gather exceptions to wrap in a composite exception at the end.
      final KeySetView<IOException, Boolean> innerExceptions = ConcurrentHashMap.newKeySet();
      BatchHelper batchHelper =
          batchFactory.newBatchHelper(
              httpRequestInitializer,
              gcs,
              storageOptions.getMaxRequestsPerBatch(),
              fullObjectNames.size(),
              storageOptions.getBatchThreads());
  
      for (StorageResourceId fullObjectName : fullObjectNames) {
        queueSingleObjectDelete(fullObjectName, innerExceptions, batchHelper, 1);
      }
  
      batchHelper.flush();
  
      if (innerExceptions.size() > 0) {
        throw GoogleCloudStorageExceptions.createCompositeException(innerExceptions);
      }
    }
docs: See {@link GoogleCloudStorage#deleteObjects(List)} for details about expected behavior.