C+linq(concat)重写为java
我有一个使用linq的C代码示例,但我正在尝试将其转换为java代码Java8。但是我对发生的事情感到非常困惑。此外,我无法在java中再现与c代码相同的结果C+linq(concat)重写为java,java,c#,linq,java-8,Java,C#,Linq,Java 8,我有一个使用linq的C代码示例,但我正在尝试将其转换为java代码Java8。但是我对发生的事情感到非常困惑。此外,我无法在java中再现与c代码相同的结果 public IEnumerable<Node> GetNeighborNodes(Node v) { var q = (from edge in this.Edges where edge.Start == v select edge.End) .Concat(from
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中重现吗?在java 8中,使用for concat在两个列表之间
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);
我假设如果使用ORM模型,您将返回一个列表。或者,如果使用JDBC,则使用带有联合连接的SQL查询并返回联合结果集,从而防止您对代码进行更改,尤其是在数据集庞大的情况下。我认为问题不在于连接。这只在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())
);
这和
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())
);
您使用的是JDBC明文还是JPA?在java和c代码中,边都是边对象的列表。表达式从所有边中选择节点Edge.End where Edge.Start==v以及所有节点Edge.Start where Edge.End==v。Concat只是将select的两个结果IEnumerable连接到一个IEnumerable。Concat方法只是将两个IEnumerable序列连接成一个
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())
);