Проверка пустого списка в java 8

Я новичок в Java8. Я реализовал списки и фильтры. Я сделал проверку на null в коде. Я был бы признателен за помощь в том, как проверить, не пуст ли список в том же фрагменте кода. Если список не пуст, то код должен продолжить утверждение.

    list.stream().filter(listElement -> listElement != null).
    forEach((listElement) -> Assert.assertEquals(
        ValueType.CANDY,
        listElement.getCandyType()));

4 ответов


вы задаете устаревший вопрос. Потоки обрабатывают все элементы источника, поэтому, если нет элементов, не будет предпринято никаких действий. Таким образом, вам не нужно проверять, является ли список пустым.

тем не менее, вы можете упростить свой код:

list.stream().filter(Objects::nonNull)
    .map(listElement -> listElement.getCandyType())
    .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType));

или

Assert.assertTrue(list.stream().filter(Objects::nonNull)
                      .map(listElement -> listElement.getCandyType())
                      .allMatch(Predicate.isEqual(ValueType.CANDY));

allMatch следует правилам, необходимым для этой проверки. Если нет элементов, нет противоречащего элемента, следовательно всего матча. Обратите внимание, что listElement -> listElement.getCandyType() также может быть заменена ссылкой на метод формы ClassName::getCandyType; Я не делал этого здесь, поскольку я не знаю правильного имени класса.

между обоими вариантами нет разницы в производительности. allMatch вернется немедленно при встрече с первым несоответствующим элементом, и assertEquals будет бросать на первый не соответствующий элемент. Во втором случае трассировка стека не будет показывать артефакты реализации API потока.

второй предпочтительнее, когда вы предоставляете проверяет производственный код, а не модульные тесты и позволяет отключить эти проверки, как с языком Java assert элемент, например

assert list.stream().filter(Objects::nonNull)
           .map(listElement -> listElement.getCandyType())
           .allMatch(Predicate.isEqual(ValueType.CANDY));

поскольку эта форма гарантирует, что не будет накладных расходов при отключении утверждений, тогда как первый вариант, имеющий assert заявление с forEach действие все еще может вызвать итерацию по всем элементам и выполнение промежуточных шагов конвейера.


выбранный ответ велик, просто небольшое предложение для обработки нулевого случая с Optional.ofNullable на недавно введенный в Java8 дополнительный класс:

  Optional.ofNullable(list)
            .orElseGet(Collections::emptyList)
            .stream().filter(Objects::nonNull)
            .map(listElement -> listElement.getCandyType())
            .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););

Проверьте isEmpty метод

if (list.isEmpty()) { ... }

вот документ:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#isEmpty()


утверждая, что список пуст-это отдельная вещь от утверждения, что любой конкретный элемент списка имеет несколько форм (т. е. getCandyType() == ValueType.CANDY). Попытка связать две идеи вместе-это просто неправильный способ сделать что-то.

что вам нужно сделать, это добавить второе утверждение, либо до, либо после forEach, что значит

assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE)))

... или что-то подобное.

одним из основных моментов пустых списков является то, что они могут быть обработаны в так же, как и списки, содержащие элементы. Вот почему такие вещи, как дополнительный класс и нулевой шаблон. Так что если вы действительно заботитесь, что список пуст, вы действительно должны сделать его отдельных утверждения.