MST

星途 面试题库

面试题:Java Stream collect实现复杂的集合嵌套生成

有一个List<String>,每个字符串代表一个文件路径,例如:["/user/doc/file1.txt","/user/img/image1.jpg","/admin/doc/file2.txt"]。需要使用Stream的collect方法将这些路径按照一级目录进行分类,生成一个Map<String, List<String>>,其中键为一级目录名(如"user","admin"),值为该目录下的文件路径列表。同时,要对生成的List<String>按照路径长度进行排序。请给出完整的实现代码,并详细阐述实现过程中对Stream操作以及Collectors工具类的运用技巧。
25.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
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工具类的运用技巧

  1. Stream操作

    • stream():将List<String>转换为Stream<String>,开启流操作。
    • collect():对流中的元素进行收集操作,生成最终结果。
  2. Collectors工具类

    • groupingBy():按照指定的分类函数对流中的元素进行分组。这里使用path -> path.split("/")[1]作为分类函数,将路径按照一级目录进行分类。groupingBy接受两个参数,第一个参数是分类函数,第二个参数是下游收集器,用于对每个分组内的元素进行进一步处理。
    • mapping():用于转换流中的元素,同时指定下游收集器。这里使用Function.identity()保持元素不变,然后通过下游收集器进行进一步处理。
    • collectingAndThen():接受两个参数,第一个是一个收集器,第二个是一个转换函数。先使用收集器将元素收集到List中,然后使用转换函数对这个List进行排序,按照路径长度进行排序。
    • toList():将流中的元素收集到一个List中。

通过这些操作和工具类的组合,实现了将文件路径按照一级目录分类,并对每个目录下的路径按照长度排序的功能。