У меня очень простой Java-компонент, WatchedFile
, который имеет поле fileName
.Functionaljava: сортировка списка произвольных типов
Я хотел бы отсортировать fj.data.List
из WatchedFile
объектов, но я борюсь с определяя 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?
Вы можете сделать эквивалент кода вопроса «используя некоторую магию Java 8»: '.sort (Ord.ord (a-> b-> Ord.stringOrd.compare (a.fileName, b.fileName))) ', но он по-прежнему уродлив по сравнению с альтернативами ... – Holger
Это здорово, Ord.stringOrd.comap() был именно тем, что я искал. Я также попытаюсь переоценить потребность в функциональных функциях с учетом особенностей Java 8. Большое спасибо. – egbokul