code: @Override
      public Optional<File> which(Iterable<String> filenames) {
          for (File parent : ImmutableList.copyOf(parents)) {
              for (String filename : filenames) {
                  Iterable<String> filenameVariations = transform.apply(filename);
                  for (String filenameVariation : filenameVariations) {
                      File file = new File(parent, filenameVariation);
                      if (isValidResult(file)) {
                          return Optional.of(file);
                      }
                  }
              }
          }
          return Optional.empty();
      }
docs: Returns the {@code File} object representing the pathname that is
  the result of joining a parent pathname with the argument filename and
  is valid for a given predicate. The predicate is checked with
  {@link #isValidResult(java.io.File) }.
  @param filenames the filenames to search for
  @return the {@code File} object, or null if not found