Как преобразовать этот кусок кода, используя Java 8? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь преобразовать этот фрагмент кода, используя Java 8.

private boolean hasOneFuelType(final List<PoiBE> pois) {
        for(PoiBE poiBE: pois) {
            if(poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1) {
                return false;
            }
        }
        return true;
    }

Итак, в приведенном выше коде я хочу вернуть false, если в списке pois есть хотя бы один poi, который имеет список типов, который больше 1, иначе я хочу вернуть истину.

Я пробовал этот код, но, по-видимому, неверен.

pois.stream().anyMatch(poiBE -> {
    if(poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1) {
      return false;
    }
      return true;
});

return true;

Ответы [ 4 ]

3 голосов
/ 05 августа 2020
return pois.stream().allMatch(
    poiBE -> poiBE.getDetails().getSimpleRefueling().getTypes().size() <= 1);
3 голосов
/ 05 августа 2020

Вы близки.

Операторы return внутри anyMatch возвращаются не из вашего метода, а из лямбда, переданного в anyMatch:

boolean anyHasMoreThanOneFuelType = pois.stream().anyMatch(poiBE -> {
    if(poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1) {
      return true;
    }
    return false;
});

return !anyHasMoreThanOneFuelType;

Это, конечно, можно упростить, если вы замените anyMatch на noneMatch и пропустите ненужное if, напрямую вернув логический результат сравнения:

return pois.stream().noneMatch(
    poiBE -> poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1);
3 голосов
/ 05 августа 2020

noneMatch возвращает false, если какой-либо элемент в потоке соответствует заданному предикату, и true в противном случае.

return pois.stream()
         .noneMatch(poiBE -> poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1);
2 голосов
/ 05 августа 2020

Вы можете использовать

return pois.stream()
       .noneMatch(poiBE -> poiBE.getDetails().getSimpleRefueling().getTypes().size() > 1);
...