将Java Stream转换为Set

时间:2019-01-08 01:23:49

标签: java lambda java-stream

我有一个由int组成的二维数组,以及一个带有参数的方法,该参数指向其一行之一。我想在该行的非零元素上返回Set,并且我想在不使用for循环的情况下执行此操作。这就是我尝试过的:

public Set<Integer> getNeighbors(int node) {
        assert node >= 0 && node < numNodes : "getNeighbors(): Invalid node parameter given: " + node + ".";
       return Arrays.stream(matrix[node]).filter(n->n>0).collect(Collectors.toSet());
    }

不幸的是,我遇到了一个编译时错误,很难解析:

A Screenshot from my IDE

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

return Arrays.stream(matrix[node])
             .filter(n -> n > 0)
             .boxed()
             .collect(Collectors.toSet());

会做到的。 .boxed()位是相关部分。

答案 1 :(得分:2)

您正在尝试使用int原语创建Set,(Arrays.stream返回以指定IntStream作为其源的顺序Array “)和Set<int>不允许。您要添加boxed()来将IntStream转换为Stream<Integer>

public Set<Integer> getNeighbors(int node) {
    assert node >= 0 && node < numNodes : "getNeighbors(): Invalid node parameter given: " + node + ".";
    return Arrays.stream(matrix[node])   //IntStream
                 .filter(n->n>0)   
                 .boxed()                //Convert to Stream<Integer>
                 .collect(Collectors.toSet());
}