java

ctrmrzij  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(280)

我正在尝试用lambda替换java for循环。
我先上一节课 Arrs: ```
public class Arrs {

private boolean isX;

public boolean isX() {
    return isX;
}

public void setX(boolean x) {
    isX = x;
}

}

然后我有一门课叫 `Example:` ```
public class Example {

    private Arrs[] arrs;

    public Arrs[] getArrs() {
        return arrs;
    }

    public void setArrs(Arrs[] arrs) {
        this.arrs = arrs;
    }
}

那么在我的主要我想计算的总次数的真实价值 isX 变量。使用纯java for循环,代码是:

int count = 0;
for(Example anExample : exampleList) {
    for(Arrs anArray : anExample.getArrs()) {
        if(anArray.isX()) {
            count++;
        }
    }
}

对于lambda,我尝试了以下方法:

Stream<Object> x = a.map(anArray -> {
    return Arrays.stream(anArray).filter(array -> array.isX()).count();
});

但它不会返回正确的元素数。

mitkmikd

mitkmikd1#

相同的平面图,但使用reduce而不是filter+count:

exampleList.stream()
    .flatMap(example -> Arrays.stream(example.getArrs()))
    .reduce(0, (total, arr) -> arr.isX() ? total+1 : 0);

reduce是一个很好的小函数,它遍历一个流,在“传递”一个值的同时对每个元素做一些事情。
更多关于这个问题

fcy6dtqo

fcy6dtqo2#

好吧,你可以用 flatMap 以及 filter :

long count = exampleList.stream()
    .flatMap(example -> Arrays.stream(example.getArrs()))
    .filter(Arrs::isX) // Arrs::isX == arr -> arr.isX()
    .count();

首先,我们浏览示例列表,并将每个元素平面Map到 getArrs() . 平面Map确保 getArrs() 在单个流中存在。
然后我们就按 predicate 过滤 arr.isX() . 最后,我们打电话来 count() 在流上,返回(剩余)元素的数量。

nbysray5

nbysray53#

您没有从examplelist中获取对象。下面是您正在尝试实现的一段代码。:)

long x = exampleList.stream().map(example-> {
            return Arrays
                    .stream(example.getArrs())
                    .filter(array -> array.isX())
                    .count();
        }).count();

相关问题