Вложенный цикл for в лямбда - Java

Я пытаюсь заменить цикл java for на лямбду.

У меня сначала класс Arrs:

public class Arrs {

    private boolean isX;

    public boolean isX() {
        return isX;
    }

    public void setX(boolean x) {
        isX = x;
    }
}

Тогда у меня есть класс под названием Example:

public class Example {

    private Arrs[] arrs;

    public Arrs[] getArrs() {
        return arrs;
    }

    public void setArrs(Arrs[] arrs) {
        this.arrs = arrs;
    }
}

Затем в моем основном я хочу подсчитать общее время истинного значения переменной isX. Используя чистую Java для цикла, код:

int count = 0;
for(Example anExample : exampleList) {
    for(Arrs anArray : anExample.getArrs()) {
        if (anArray.isX()) {
            count++;
        }
    }
}

С лямбдой я пробовал следующее:

Stream<Object> x = a.map(anArray -> {
    return Arrays.stream(anArray).filter(array -> array.isX()).count();
});

Но он не возвращает правильный номер элемента.

Не лучшая идея называть свой класс Array.

Eritrean 15.12.2020 11:58

Это просто пример кода.

harry-potter 15.12.2020 12:01

@DistribuzioneGaussiana это плохой пример, я думаю, вам следует изменить имя!

Youcef LAIDANI 15.12.2020 12:03

Пожалуйста, сосредоточьтесь на вопросе.

harry-potter 15.12.2020 12:07

@DistribuzioneGaussiana вызывает класс Array, который сам по себе не представляет массив, просто вводит в заблуждение и приводит к еще большей путанице. Трудно сосредоточиться на своем вопросе

Lino 15.12.2020 12:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
151
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ну, вы могли бы просто использовать flatMap и filter:

long count = exampleList.stream()
    .flatMap(example -> Arrays.stream(example.getArrs()))
    .filter(Arrs::isX) // Arrs::isX == arr -> arr.isX()
    .count();

Во-первых, мы просматриваем список примеров и сопоставляем каждый элемент с getArrs(). Плоское отображение гарантирует, что все элементы всех getArrs() присутствуют в одном потоке.

Затем мы просто фильтруем по предикату arr.isX(). Наконец, мы вызываем count() в потоке, который возвращает количество (оставшихся) элементов.

та же плоская карта, но с уменьшением вместо фильтра+количества:

exampleList.stream()
    .flatMap(example -> Arrays.stream(example.getArrs()))
    .reduce(0, (total, arr) -> arr.isX() ? total+1 : 0);

reduce — это небольшая приятная функция, которая проходит через поток и что-то делает с каждым элементом, «перенося» значение.

больше по теме Здесь

Вы не получаете объекты из списка примеров. Вот кусок кода, который вы пытаетесь достичь. :)

long x = exampleList.stream().map(example-> {
            return Arrays
                    .stream(example.getArrs())
                    .filter(array -> array.isX())
                    .count();
        }).count();

Теперь вы подсчитываете только количество элементов в исходном списке, а не количество массивов, соответствующих array.isX(), вы, вероятно, хотели использовать mapToLong, а затем sum

Lino 15.12.2020 12:05

Другие вопросы по теме