0

我有一个非常简单的 Java bean WatchedFile,它有一个fileName字段。

我想对一个对象进行排序fj.data.ListWatchedFile但我正在努力fj.Ord为列表的sort()方法定义一个。这就是我想出的:

protected List<WatchedFile> getWatchedFileList(String path) throws IOException {
    List<File> files = List.list(new File(path).listFiles());
    return files
            .map((file) -> new WatchedFile(file.getName(), false, file.length()))
            .sort(Ord.ord(new F<WatchedFile, F<WatchedFile, Ordering>>()
            {
                @Override
                public F<WatchedFile, Ordering> f(final WatchedFile watchedFile1)
                {
                    return new F<WatchedFile, Ordering>()
                    {
                        @Override
                        public Ordering f(final WatchedFile watchedFile2)
                        {
                            int compareResult = watchedFile1.fileName.compareTo(watchedFile2.fileName);
                            return (compareResult < 0 ? Ordering.LT :
                                    (compareResult > 0 ? Ordering.GT : Ordering.EQ));
                        }
                    };
                }
            }));
}

这太丑了!我确信有更好的方法来实例化一个Ord对象......可能利用一些 Java 8 魔法?

4

1 回答 1

2
protected List<WatchedFile> getWatchedFileList(String path) throws IOException {
    List<File> files = Arrays.asList(new File(path).listFiles());
    return files.stream()
        .map(file -> new WatchedFile(file.getName(), false, file.length()))
        .sorted((wf1, wf2)->wf1.fileName.compareTo(wf2.fileName))
        .collect(Collectors.toList());
}

建议public String getFileName()在你的类中有一个方法WatchedFile。在这种情况下,您可以简单地说:

protected List<WatchedFile> getWatchedFileList(String path) throws IOException {
    List<File> files = Arrays.asList(new File(path).listFiles());
    return files.stream()
        .map(file -> new WatchedFile(file.getName(), false, file.length()))
        .sorted(Comparator.comparing(WatchedFile::getFileName))
        .collect(Collectors.toList());
}

并且,使用 NIO2 获取目录条目,它可能看起来像:

protected List<WatchedFile> getWatchedFileList(String path) throws IOException {
    try {
        return Files.list(Paths.get(path))
            .map(p -> new WatchedFile(p.toString(), false, fileSize(p)))
            .sorted(Comparator.comparing(WatchedFile::getFileName))
            .collect(Collectors.toList());
    } catch(UncheckedIOException ex) { throw ex.getCause(); }
}
private long fileSize(Path path) {
    try { return Files.size(path); }
    catch (IOException ex) { throw new UncheckedIOException(ex); }
}

如果您想保留在“功能 Java”API 中,解决方案可能如下所示:

protected List<WatchedFile> getWatchedFileList(String path) throws IOException {
    List<File> files = List.list(new File(path).listFiles());
    return files
        .map(file -> new WatchedFile(file.getName(), false, file.length()))
        .sort(Ord.stringOrd.comap(wf -> wf.fileName));
}

关键是您不需要(不应该)重新实现方式,String比较 s。相反,指定函数以获取要比较的属性值。Comparator.comparing与第二个代码示例中使用的Java 8 工厂方法进行比较。

于 2014-09-15T10:41:04.733 回答