我有一个 C# 代码示例(使用 linq),但我试图将其转换为 java 代码(java 8)。但是我对发生的事情感到非常困惑。此外,我无法在 java 中重现与 c# 代码相同的结果。
public IEnumerable<Node> GetNeighborNodes(Node v)
{
var q = (from edge in this.Edges
where edge.Start == v
select edge.End)
.Concat(from edge in this.Edges
where edge.End == v
select edge.Start);
return q;
}
我对Concat部分感到非常困惑。谁能解释会发生什么以及如何在 java 中重现它?
var q = (from edge in this.Edges
where edge.Start == v
select edge.End)
.Concat(from edge in this.Edges
where edge.End == v
select edge.Start);
这与
var q =
ctx.Edges.Where(o => o.Start == v).Select(o => o.End).Union(
ctx.Edges.Where(o => o.End == v).Select(o => o.Start)).ToList();
这将是
Stream<Node> q = Stream.concat(
this.getEdges().stream().filter(o-> o.getStart() == v).map(o-> o.getEnd()),
this.getEdges().stream().filter(o-> o.getEnd() == v).map(o-> o.getStart())
);
在 Java 8 中,使用 Stream API 在 2 个列表之间进行连接。
List<Edge> result1 = ....;
List<Edge> result2 = ....;
//Java 8 and higher
List<Edge> q = Stream.concat(result1.stream(), result2.stream()).collect(Collectors.toList());
或者,如果不使用 Java 8 或更高版本
List<Edge> q = new ArrayList<>();
q.addAll(result1);
q.addAll(result2);
我假设您将返回List<Edge>
(如果使用ORM模型)。或者,如果使用 JDBC,请使用带有UNION
联接的 SQL 查询并返回联合结果集,从而防止对代码执行连接,尤其是在数据集很大的情况下。
我认为问题不在于Concat
.这仅在 C# 代码中是必需的,因为它的编码不是很好。你可以在 Java 中做同样的事情(对不起,我的 java 有点生疏,但我想你明白了):
ArrayList<Edge> q = new ArrayList<Edge>();
for (Edge edge : this.getEdges())
{
if (edge.getStart() == v)
{
q.add(edge.getEnd());
}
else if (edge.getEnd() == v)
{
q.add(edge.getStart());
}
}
我想Java等效代码将是这样的:
Stream<Node> q = Stream.concat(
this.getEdges()
.stream()
.filter(edge -> edge.getStart() == v)
.map(edge -> edge.getEnd()),
this.getEdges()
.stream()
.filter(edge -> edge.getEnd() == v)
.map(edge -> edge.getStart())
);