我有內(nèi)部節(jié)點(diǎn)和終端節(jié)點(diǎn)的樹(shù)狀結(jié)構(gòu):public interface Node{}public class InternalNode implements Node { private List<Node> nodes;}public class TerminalNode implements Node { private String label;}我現(xiàn)在有一個(gè)List<Node>我想壓平的。在這里,展平意味著我想用它的孩子遞歸地替換一個(gè)內(nèi)部節(jié)點(diǎn),直到所有內(nèi)部節(jié)點(diǎn)都被終端替換。我想出了這個(gè)功能:private static List<Node> flatten(final List<Node> nodes) { return nodes .stream() .map(node -> { if (node instanceof InternalNode) { return flatten(((InternalNode) node).getNodes()); } return Collections.singletonList(node); }) .flatMap(List::stream) .collect(Collectors.toList());}這似乎完成了它的工作。但是,我想知道是否有更好的實(shí)現(xiàn)方式。我首先必須將 a 包裝TerminalNode成一個(gè)單例列表(類(lèi)型List<TerminalNode>) via Collections.singletonList(node),然后我必須再次將該單例列表轉(zhuǎn)換回節(jié)點(diǎn),這似乎很奇怪flatMap(List::stream)。有沒(méi)有辦法避免這種無(wú)用的情況,Collections.singletonList(node)然后flatMap(List::stream)是終端節(jié)點(diǎn)?
1 回答

慕工程0101907
TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
你可以直接使用 flatMap :
private static Stream<TerminalNode> flatten(final List<Node> nodes) {
return nodes
.stream()
.flatMap(node -> {
if (node instanceof InternalNode) {
return flatten(((InternalNode) node).getNodes());
}
return Stream.of((TerminalNode) node);
});
}
如果你想要一個(gè)列表,你可以只收集該方法調(diào)用的結(jié)果。
添加回答
舉報(bào)
0/150
提交
取消