我正在尝试将此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()方法调用之前发生了什么:
.map(this::getNode).collect(Collectors.toSet())
有人可以提供伪代码来解释吗?
问题来源:Stack Overflow
对于每个循环,流基本上都是光荣的。通常,当您看到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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。