开发者社区> 问答> 正文

有人可以将这个非常简洁的Java函数分解成更详细的示例吗?

我正在尝试将此Java教程移植到Xojo。我正在努力解压缩Set下面的函数,因为尽管简短而优雅,但它会将很多转换塞进一个狭小的空间,并且不确定我是否理解正确。很难,因为Java不是我的主要语言,并且Xojo缺少对泛型的支持:

public interface GraphNode {
    String getId();
}


public class Graph<T extends GraphNode> {
    private final Set<T> nodes;
    private final Map<String, Set<String>> connections;

    public T getNode(String id) {
        return nodes.stream()
            .filter(node -> node.getId().equals(id))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("No node found with ID"));
    }

    public Set<T> getConnections(T node) {
        return connections.get(node.getId()).stream()
            .map(this::getNode)
            .collect(Collectors.toSet());
    }
}

我基本上只能弄清楚在.stream()方法调用之前发生了什么:

  1. 获取Id通过的node GraphNode
  2. 获取Set 来自connections Map其键检索匹配Id 我不明白的是这里发生的事情:
.map(this::getNode).collect(Collectors.toSet())

有人可以提供伪代码来解释吗?

问题来源:Stack Overflow

展开
收起
montos 2020-03-25 21:47:09 385 0
1 条回答
写回答
取消 提交回答
  • 对于每个循环,流基本上都是光荣的。通常,当您看到XXX.stream()或方法返回a时Stream ,分别表示“对于”中的每个事物XXX和“对于每个XXX ...”。

    因此,这里说“对于...中的每个字符串Set ”

    map意思是“把每件事变成其他东西”,换句话说,就是一种转变。使用for循环,就像在伪代码中这样:

    For Each x In set
        f(x)
    Next x
    

    f是您传入的函数。在这种情况下,它是getNode。

    现在,getNode返回T,因此我们原始集中的每个元素都已转换为T。最后一个调用是collect,这意味着将所有这些元素放回到某个集合或其他对象中。在这种情况下,我们将所有这些转换后的Ts重新放回new Set。

    伪代码中的整个代码为:

    originalSet = connections.get(node.getId())
    newSet = []
    For Each x In originalSet
        newSet.add(x)
    Next x
    

    回答来源:Stack Overflow

    2020-03-25 21:48:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载