C# + linq(concat) rewrite to java



我有一个 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())
);

相关内容

  • 没有找到相关文章

最新更新