Java 8如何使用流检查一个数字是否被多个数字除

Java 8如何使用流检查一个数字是否被多个数字除,java,java-8,java-stream,Java,Java 8,Java Stream,如何检查数字的一个范围是否除以多个数字。例如,如果它只有1个除数,这将起作用,但我不知道当我有一个来自数字的数组时该怎么办: int limitNumber = 10; int onlyOneDivisor = 2; String input = "2 3"; int[] nums = Arrays.stream(input.split(" ")).mapToInt(Integer::parseInt).toArray(); //这很好,但它只除以2 IntStream.rangeClosed

如何检查数字的一个范围是否除以多个数字。例如,如果它只有1个除数,这将起作用,但我不知道当我有一个来自数字的数组时该怎么办:

int limitNumber = 10;
int onlyOneDivisor = 2;
String input = "2 3";
int[] nums = Arrays.stream(input.split(" ")).mapToInt(Integer::parseInt).toArray();
//这很好,但它只除以2

IntStream.rangeClosed(0, limitNumber).filter(n -> (n % onlyOneDivisor == 0))
.forEach(x -> System.out.print(x + " "));

您可以为每个除数应用一个
过滤器

IntStream stream = IntStream.rangeClosed(0, limitNumber);

for (int divisor: divisors) {
    stream = stream.filter(n -> n % divisor == 0);
}

stream.forEach(x -> System.out.print(x + " "));
要一次性完成,您需要立即检查所有因素的可除性。内联写有点多,所以我推荐一个helper方法
isdivisiblybayall
(实现作为练习)

一个更聪明的方法可能是计算因子的整数,然后只检查该数的整除性。

“除以1以上的数”意味着不是,因此:

然后定义一个方法:

private boolean isNotPrime(int n) {
    int s = (int)Math.sqrt(n);
    for (int i = 2; i < s; i++)
        if (n % 2 == 0) return true;
    return false;
}
私有布尔值isNotPrime(int n){
ints=(int)Math.sqrt(n);
对于(int i=2;i
我会在
过滤器中使用
allMatch

String input = "2 3";

int[] divisors = Arrays.stream(input.split(" "))
    .mapToInt(Integer::parseInt)
    .toArray();

int limitNumber = 10;

IntStream.rangeClosed(0, limitNumber) // maybe 1 and not 0?
    .filter(n -> Arrays.stream(divisors).allMatch(d -> n % d == 0))
    .forEach(System.out::println); // 0 6

这里我在
过滤器
中的
除数
数组上进行流式处理,以检查所有除数是否实际除以当前数字。如果此条件成功,则数字将保留在流中并最终打印。

您可以使用
过滤器
,通过另一个流对所有除数进行过滤,并使用
所有匹配
任何匹配
,具体取决于具体的使用情况:

int max = 10;
int[] divisors = {2, 3, 5};

// no divisor
IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.of(divisors).allMatch(d -> n % d != 0))
        .forEach(System.out::println);

// any divisor
IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.of(divisors).anyMatch(d -> n % d == 0))
        .forEach(System.out::println);
如果要检查一个数字是否正好有两个除数(给定多于两个的列表),可以使用内部
过滤器
,并将其与
计数
相结合:

// exactly two divisors
IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.of(divisors).filter(d -> n % d == 0).count() == 2)
        .forEach(System.out::println);
但是,请注意,如果要查找素数,可能不应使用固定的除数列表,而应根据测试的数字确定除数:

IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.range(2, n).allMatch(d -> n % d != 0))
        .forEach(System.out::println);

(这里使用
n
作为上限不是很有效;
sqrt(n)
就足够了,只有奇数和两个,还有更多的优化。)

我不太清楚最终目标是什么。最终目标是打印从0到10的所有数字,在本例中,除以2和3意味着除以6,否?为了使用流,过滤器可以是
…过滤器(n->数组.stream(除数).allMatch(d->(n%d)==0))
// exactly two divisors
IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.of(divisors).filter(d -> n % d == 0).count() == 2)
        .forEach(System.out::println);
IntStream.rangeClosed(0, max)
        .filter(n -> IntStream.range(2, n).allMatch(d -> n % d != 0))
        .forEach(System.out::println);