### Question:
FileIterable { public static FluentIterable<KeyedIterable<Path, Path>> groupFilesByDir(final Path root) { return new FluentIterable<KeyedIterable<Path, Path>>() { @Override public Iterator<KeyedIterable<Path, Path>> iterator() { return new GroupedPathIterator(root.toFile()); } }; } private  FileIterable(); static FluentIterable<Path> fileTreeWalker(final Path root); static Iterable<Path> toPaths(File[] files); static Iterable<Path> toPaths(Iterable<File> files); static Iterable<File> toFiles(Iterable<Path> files); static FluentIterable<KeyedIterable<Path, Path>> groupFilesByDir(final Path root); static FluentIterable<String> lines(final Path path); static FluentIterable<String> unzipLines(final Path path, final Charset cs); static Function<? super Iterable<F>, Iterable<T>> bind(final Function<? super F, Iterable<T>> f); static Function<? super Iterable<F>, Iterable<T>> lift(final Function<F, T> f);  }### Answer:
@Test public void testCombine() { Path root = new File("ftp.ncdc.noaa.gov/pub/data/gsod/1988").toPath(); FluentIterable<KeyedIterable<Path,Path>> iterables = FileIterable.groupFilesByDir(root); for(Iterable<Path> it : iterables) { System.err.println("Next Iterable"); for(Path p : it) { System.err.println(p); } } }