Я пытаюсь заменить цикл 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();
});
Но он не возвращает правильный номер элемента.
Это просто пример кода.
@DistribuzioneGaussiana это плохой пример, я думаю, вам следует изменить имя!
Пожалуйста, сосредоточьтесь на вопросе.
@DistribuzioneGaussiana вызывает класс Array, который сам по себе не представляет массив, просто вводит в заблуждение и приводит к еще большей путанице. Трудно сосредоточиться на своем вопросе




Ну, вы могли бы просто использовать 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
Не лучшая идея называть свой класс
Array.