我是 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/