如何使用 Stream Java 8 按元素比较两个列表?

Den*_*nis 2 java compare list java-stream

这是某个网站上的一个简单任务。

如果 a[i] > b[i],则 Alice 获得 1 分。如果 a[i] < b[i],则 Bob 获得 1 分。如果 a[i] = b[i],则任何人都不会得分。返回:Alice 的分数位于第一位置,Bob 的分数位于第二位置。

我可以使用流来编写这段代码吗?

public static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
    int alice = 0;
    int bob = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a.get(i) > b.get(i)) 
            alice++;
        else if (a.get(i) < b.get(i)) 
            bob++;
    }
    return Arrays.asList(alice, bob);
}
Run Code Online (Sandbox Code Playgroud)

...

经过一番思考,我写了这段代码:

public static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
    Integer[] result = {0, 0};
    IntStream.range(0, Math.min(a.size(), b.size()))
            .map(i -> a.get(i).compareTo(b.get(i)))
            .forEach(i -> {
                if (i > 0) result[0]++;
                else if (i < 0) result[1]++;
            });
    return Arrays.asList(result);
}
Run Code Online (Sandbox Code Playgroud)

但这段代码并没有简洁多少。有没有办法让代码变得更漂亮?

hev*_*ev1 6

filter您可以使用and使代码更短count,但这里使用循环更简洁。Stream并不总是解决方案。

return Arrays.asList(
    IntStream.range(0, Math.min(a.size(), b.size())).filter(i -> a.get(i) > b.get(i)).count(),
    IntStream.range(0, Math.min(a.size(), b.size())).filter(i -> a.get(i) < b.get(i)).count()
);
Run Code Online (Sandbox Code Playgroud)