Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+linq(concat)重写为java_Java_C#_Linq_Java 8 - Fatal编程技术网

C+linq(concat)重写为java

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

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