java 7 for 循环到 java 8 IntStream forEach

Tiy*_*iya 1 java java-stream

对于以下 Java 7 代码,

public static boolean java8Test() {
    boolean flag = true;
    for(int i = 67 ; i < 79 ; i++) {
        if(!testBoolean(i)) {
            flag = false;
        }
    }
    return flag;
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个 Java8 代码来使用 java 8 功能对从 67 到 78(包括两者)的一系列数字执行 testBoolean 方法。

此外,java8Test()如果testBoolean返回 false,则应返回 false,但是对于给定数字范围内的所有数字,处理不应停止并继续。

我已经尝试过下面的代码,但是这段代码在返回我不想要的 false 后停止执行 testBoolean 方法。我希望继续执行并记住 java8Test 方法可以在所有数字范围执行后返回的错误标志

public static boolean java8Test() {
    return IntStream.range(67, 78+1).anyMatch(index -> !testBoolean(index));
}

private static boolean testBoolean(int index) {
    System.out.println(index + "\n");
    switch(index) {
        case 67 :
        case 68 :
            return false;
        default :
            return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ral*_*ner 5

您可以将 anIntStream用于所需的范围,调用testBoolean每个给您 a 的值Boolean,然后调用reduce流:

public static boolean java8Test() {
  return IntStream.rangeClosed(67, 78)
    .mapToObj(x -> testBoolean(x))
    .reduce(Boolean.TRUE,
       (aBoolean, aBoolean2) -> aBoolean && aBoolean2
    );
}
Run Code Online (Sandbox Code Playgroud)

归约假设结果最初为真,并通过将“逻辑与”( &&) 与每个方法调用结合使用来组合初始值来产生最终结果testBoolean。因此,对于给定范围内的每个值,该方法都会被调用,如果任何方法调用为假,则最终结果为假,否则为真。使用方法引用时,上面的代码变成

public static boolean java8Test() {
  return IntStream.rangeClosed(67, 78)
    .mapToObj(Scratch::testBoolean)
    .reduce(Boolean.TRUE,
       Boolean::logicalAnd
    );
}
Run Code Online (Sandbox Code Playgroud)

  • `IntStream.rangeClosed(67, 78)` 会阻止执行 `+1` 数学运算,而 `.reduce(Boolean.TRUE, Boolean::ologicalAnd)` 只会使其更具可读性。 (2认同)