Java 流映射 T -> ?T :List<T>

标签 java java-stream

我是 java 新手,喜欢 Stream API。 我得到了这个循环:

List<FileTree> expanded = new ArrayList<>();
for(FileTree item : tree){
    if(item.getType().equals("tree")){
        expanded.addAll(getTreeOfSubStudPackage(item.getName()));
    }
    else{
        expanded.add(item);
    }
}

我想知道这是否可以转换为一个整洁的流。我的第一个猜测如下:

tree.stream().map(fileTree -> {
    if(fileTree.getType().equals("tree")){
        return getTreeOfSubStudPackage(fileTree.getName());
    }
    else{
        return fileTree;
    }
}).collect(Collectors.toList());

它编译得很好。但这是推荐的吗?我什至实现了“No-Go”还是有更好的方法? 最后但并非最不重要的一点是:.stream() 中是否存在使此改进变得毫无值(value)的开销?

附录

List<FileTree> getTreeOfSubStudPackage(...){
    //...
}

class FileTree {
    private String name;
    private String type;
    private String mode;
    private String id;
    //... Public Getter And Setter ...
}

最佳答案

您需要先执行map,然后执行flatMap

Arrays.asList(item) 是将元素添加到List中,以便在接下来的flatMap中扁平化

    tree.stream()
        .map(item -> item.getType().equals("tree") ? getTreeOfSubStudPackage(item.getName()) : Arrays.asList(item))
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

关于Java 流映射 T -> ?T :List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40573334/

相关文章:

java - 如何使用优先级和组注释对测试用例进行排序?

java - 使用线程本地避免创建映射以减少 GC 但失败

java - Java中获取开始日期和结束日期

java - 按一个字段进行流式分组,然后合并所有其他字段

java-8 - java lambdaj 'variable_name' 无法解析为变量错误

Java 8 : Group Object array to Map to return as JSON

Java 将字符串数组映射到整数数组

Java 编译器错误

java - 使用 Spring Boot 将 zip 文件从应用程序资源文件夹复制到目标

java - 如何收集 pojo id 到 pojo 上集合的一组属性的映射