Java流映射T->?T:列表<;T>;
我是java新手,喜欢流API。 我得到了这个循环:Java流映射T->?T:列表<;T>;,java,java-stream,Java,Java Stream,我是java新手,喜欢流API。 我得到了这个循环: List<FileTree> expanded = new ArrayList<>(); for(FileTree item : tree){ if(item.getType().equals("tree")){ expanded.addAll(getTreeOfSubStudPackage(item.getName())); } else{ expanded.a
List<FileTree> expanded = new ArrayList<>();
for(FileTree item : tree){
if(item.getType().equals("tree")){
expanded.addAll(getTreeOfSubStudPackage(item.getName()));
}
else{
expanded.add(item);
}
}
它编译得很好。但这是推荐的吗?我有没有实施过禁飞,或者有没有更好的方法?
最后但并非最不重要的一点是:.stream()
中是否存在使此改进毫无价值的开销
附录
列出getTreeOfSubStudPackage(…){
//...
}
类文件树{
私有字符串名称;
私有字符串类型;
私有字符串模式;
私有字符串id;
//…公众的接受者和接受者。。。
}
您需要执行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());
你确定这个代码有效吗?您的lambda表达式在if和else子句中返回不同的类型。似乎您正在查找
.flatMap
,但您的问题有点不清楚,所以很难说。仅供参考,您的流尝试会生成一个列表
,其中包含文件树
和列表
的混合体。我从IntelliJ学到的技巧:Collections.singletonList()
@Marko Topolnik:准备学习Java 9中的List.of(…)
。但是在这里,array.asList
和singletonList
,与整个中间List
步骤一样过时。只需将map(…).flatMap(…)
替换为单个.flatMap(item->item.getType().equals(“树”)?getTreeOfSubStudPackage(item.getName()).stream():stream.of(item))
List<FileTree> getTreeOfSubStudPackage(...){
//...
}
class FileTree {
private String name;
private String type;
private String mode;
private String id;
//... Public Getter And Setter ...
}
tree.stream()
.map(item -> item.getType().equals("tree") ? getTreeOfSubStudPackage(item.getName()) : Arrays.asList(item))
.flatMap(Collection::stream)
.collect(Collectors.toList());