Java Stream Map T - &gt; ?T:列表<T>

时间:2016-11-13 11:34:09

标签: 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()中是否有开销会使这种改善变得毫无价值?

附录

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

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

1 个答案:

答案 0 :(得分:2)

您需要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());