Java:是否可以使用'嵌套'映射方法(java.util.stream)?

时间:2015-02-11 10:21:25

标签: java java-8

给定一组int(例如[8, 7, 5, 3]),我想验证这些数字是成对联合素数。

我想知道是否可以使用两种嵌套的Arrays.streammap方法来执行此操作,例如:Arrays.stream(r -> gcd(r, Map...)

你能帮助我吗?

1 个答案:

答案 0 :(得分:4)

您的问题减少了如何生成数组中的所有对。然后,您可以使用allMatch来检查成对共同属性。

这可能是一种实施方式:

private static boolean isCoPrime(int a, int b) {
    if (b == 0) return a == 1;
    return isCoPrime(b, a % b);
}

private static boolean isPairwiseCoPrime(int[] arr) {
    return IntStream.of(arr)
                    .allMatch(a -> IntStream.of(arr).filter(b -> b != a).allMatch(b -> isCoPrime(a, b)));
}

这将生成所有可能的对并检查它们是否是共同素数。然而,这会在您检查时进行不必要的计算,例如,如果对(8,7)是共素,然后是对(7,8)。所以另一种解决方法是:

private static boolean isPairwiseCoPrime(int[] arr) {
    return IntStream.range(0, arr.length - 1)
                    .allMatch(i -> IntStream.range(i + 1, arr.length).allMatch(j -> isCoPrime(arr[i], arr[j])));
}

这基本上是Java 8之前的翻译:

private static boolean isPairwiseCoPrime(int[] arr) {
    for(int i = 0; i < arr.length-1; i++) {
        for(int j = i + 1; j < arr.length; j++) {
             if(!isCoPrime(arr[i], arr[j])) {
                 return false;
             }
        }
    }
    return true;
}

正如我在this answer中所解释的那样,Stream方法并不是所有内容的替代品,有时使用传统的循环方法更简洁,更短。