面试题答案
一键面试import java.util.*;
import java.util.stream.Collectors;
public class FilePathClassification {
public static void main(String[] args) {
List<String> paths = Arrays.asList("/user/doc/file1.txt", "/user/img/image1.jpg", "/admin/doc/file2.txt");
Map<String, List<String>> result = paths.stream()
.collect(Collectors.groupingBy(
path -> path.split("/")[1],
Collectors.mapping(
Function.identity(),
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
list.sort(Comparator.comparingInt(String::length));
return list;
}
)
)
));
System.out.println(result);
}
}
实现过程中对Stream操作以及Collectors工具类的运用技巧
-
Stream操作:
- stream():将
List<String>
转换为Stream<String>
,开启流操作。 - collect():对流中的元素进行收集操作,生成最终结果。
- stream():将
-
Collectors工具类:
- groupingBy():按照指定的分类函数对流中的元素进行分组。这里使用
path -> path.split("/")[1]
作为分类函数,将路径按照一级目录进行分类。groupingBy
接受两个参数,第一个参数是分类函数,第二个参数是下游收集器,用于对每个分组内的元素进行进一步处理。 - mapping():用于转换流中的元素,同时指定下游收集器。这里使用
Function.identity()
保持元素不变,然后通过下游收集器进行进一步处理。 - collectingAndThen():接受两个参数,第一个是一个收集器,第二个是一个转换函数。先使用收集器将元素收集到
List
中,然后使用转换函数对这个List
进行排序,按照路径长度进行排序。 - toList():将流中的元素收集到一个
List
中。
- groupingBy():按照指定的分类函数对流中的元素进行分组。这里使用
通过这些操作和工具类的组合,实现了将文件路径按照一级目录分类,并对每个目录下的路径按照长度排序的功能。