java 7 для l oop до java 8 IntStream forEach - PullRequest
1 голос
/ 19 марта 2020

Для приведенного ниже кода Java 7,

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

Я хочу написать код Java8 для выполнения метода testBoolean для диапазона чисел от 67 до 78 (оба включительно), используя java 8 функциональность.

Кроме того, java8Test() должен возвращать false, если testBoolean возвращает false, однако обработка не должна останавливаться и продолжаться для всех чисел в данном диапазоне чисел.

У меня есть Я уже пробовал приведенный ниже код, но этот код останавливает выполнение метода testBoolean после того, как он вернул false, чего я не хочу. Я хочу, чтобы выполнение продолжалось и запомнил ложный флаг, который затем может вернуть метод 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;
    }
}

Ответы [ 3 ]

5 голосов
/ 19 марта 2020

Вы можете использовать IntStream для требуемого диапазона, вызывать testBoolean для каждого значения, давая вам Boolean, а затем reduce поток:

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

Сокращение предполагает, что результат первоначально равен true и дает конечный результат, комбинируя начальное значение, применяя «логическое и» (&&) с каждым вызовом метода для testBoolean. Таким образом, для каждого из значений из данного диапазона вызывается метод, и конечный результат равен false, если какой-либо из вызовов метода имеет значение false, в противном случае - true. При использовании ссылок на методы приведенный выше код становится

public static boolean java8Test() {
  return IntStream.rangeClosed(67, 78)
    .mapToObj(Scratch::testBoolean)
    .reduce(Boolean.TRUE,
       Boolean::logicalAnd
    );
}
1 голос
/ 19 марта 2020

Я не вижу большого значения в выполнении операторов, которые не изменяют результат, но вы хотите терминальную операцию, которая потребляет весь поток, такой как count():

IntStream.range(67, 78+1).filter(index -> !testBoolean(index)).count() == 0;
// or:
IntStream.range(67, 78+1).filter(index -> testBoolean(index)).count() > 0;

В качестве альтернативы вы может reduce ваш поток (думаю, foldLeft):

IntStream.range(67, 78+1).reduce(true, (result, idx) -> testBoolean(idx) && result);

Обратите внимание, что порядок операндов логического и (&&) здесь важен, если вы хотите всегда выполнять свою функцию testBoolean

0 голосов
/ 19 марта 2020

Используя IntStream, вы можете перебирать диапазон и затем использовать anyMatch или allMatch или noneMatch в зависимости от ваших требований. Нет смысла переопределять flag переменную с логическим значением даже после первого совпадения для l oop, поэтому используйте anyMatch, который завершит l oop после первого совпадения и вернет значение

!IntStream.range(67, 79).anyMatch(i->!testBoolean(i));
...