Используйте Streams для возврата Boolean, если все значения List на Карте пустые/не-пустые

Учитывая Map, сопоставляя String с List, есть ли способ использовать Java-потоки, чтобы вернуть логическое значение, где ИСТИНА означает, что один или несколько элементов списка имеют элементы? Если все списки на карте пусты, верните FALSE.

Map< String , List<String> > map = …

Может ли использование Streams заменить этот обычный код?

// See if any diffs were found. Loop through the Map, look at each List of diffs to see if non-empty.
boolean anyElementsInAnyList = false;
for (List<String> list : map.values () ) {
    if (!list.isEmpty()) {
        anyElementsInAnyList = true;
        break;
    }
}

Обратите внимание, что после первого обнаружения мы можем выйти из экзамена. Не нужно проверять все значения карты (все списки). Было бы неплохо, если бы для эффективности Stream мог выполнять ту же самую остановку-на-первом поиске (операция "короткого замыкания" ).

Ответ 1

В Java 8 вы можете проверить, что не все списки пустые.

 boolean anyNonEmpty = !map.values().stream().allMatch(List::isEmpty);

Ответ 2

Используйте метод anyMatch, который находит, если какой-либо элемент потока соответствует Predicate. Здесь ваш предикат состоит в том, что значение записи (список) не пусто.

boolean anyNonEmpty = map.entrySet()
    .stream()
    .anyMatch(entry -> !entry.getValue().isEmpty());

Ответ 3

int size = Map.entrySet().stream()
                           .map(entry -> entry.getValue())
                           .flatMap(list -> list.stream())
                           .size();
if(size==0)
  return Boolean.False;
else
  return Boolean.True;

Этот код является простым, что может помочь в вашей работе.