我有2个实体:

  • 叶子
  • 节点,其中包含叶子。

  • 我有一个Collection<Node>,我正在尝试在一行代码中构建所有Set<Integer> id的Leaf。我觉得Stream可能是可行的,但是直到现在,我只能像这样点它:
    Set<Integer> leafIds = Sets.newHashSet();
    root.getNodes()
        .forEach(node -> node.getLeaves()
                  .forEach(leaf -> leafIds.add(leaf.getId())));
    

    我不喜欢手动创建集合并使用Collection.add()方法向其中添加元素的部分(不是线程安全,危险且未优化的)。我觉得有可能做类似的事情:
    root.getNodes()
      .stream()
      .???
      .getLeaves()
      .map(Leaf::getId)
      .distinct()
      .collect(Collectors.toSet());
    

    任何想法?

    最佳答案

    有可能的。使用flatMap,您可以从这些节点的所有叶子的Stream<Node>转换为Stream<Leaf>:

    Set<Integer> leaves = root.getNodes().stream()
                              .flatMap (n -> n.getLeaves().stream())
                              .distinct()
                              .map(Leaf::getId)
                              .collect(Collectors.toSet());
    

    关于java - 使用Java 8在一行中构建一组Node.Leaf.Id,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26483324/

    10-11 20:53