可以尝试创建枚举:
public enum FileInfoComparator {
FILE_NAME(Comparator.comparing(FileInfo::getFileName)),
TIMESTAMP(Comparator.comparing(FileInfo::getTimestamp)),
SIZE(Comparator.comparing(FileInfo::getSize)),
;
private final Comparator<FileInfo> comparator;
FileInfoComparator(Comparator<FileInfo> comparator) {
this.comparator = comparator;
}
static Comparator<FileInfo> by(String key, boolean ascending) {
Comparator<FileInfo> comparator = valueOf(key).comparator;
return ascending ? comparator : comparator.reversed();
}
static Comparator<FileInfo> by(Pair<String, Boolean> criterion) {
return by(criterion.getKey(), criterion.getValue());
}
static Optional<Comparator<FileInfo>> by(List<Pair<String, Boolean>> criteria) {
return criteria.stream()
.map(FileInfoComparator::by)
.filter(Objects::nonNull)
.reduce(Comparator::thenComparing);
}
}
然后使用:
// Create the list of selected criteria based on user input:
// E.g. [FILE_NAME, false] will mean "sort by fileName descending"
List<Pair<String, Boolean>> selectedCriteria = ...
// Build your comparator and sort your list
FileInfoComparator.by(selectedCriteria).ifPresent(files::sort);
如果用户选择为空,则
files
将保持原样。