Поиск непустого списка внутри списка с использованием функций Java 8

Нет! Измените структуру данных:

alter table t alter column [Transaction Date] date;

Вам повезло. Ваш формат будет правильно преобразован.

Затем, если вы хотите его в определенном формате, используйте вычисленный столбец:

alter table t add column transaction_date_mmddyyyy as
    (replace(convert(varchar(10), [Transaction Date], 105), '-', '') )

Затем вы можете использовать дату - как дату , правильный способ его сохранения. Вы также можете получить формат презентации, который вы хотите.

8
задан MC Emperor 19 January 2019 в 15:52
поделиться

4 ответа

Optional предназначен не для замены if операторов, а для использования в качестве возвращаемого значения методов. Поэтому я думаю, что вам лучше не использовать его для этой задачи. Вместо этого вы можете использовать троичный оператор вместе с Stream.allMatch:

return message.getItems() == null || 
       message.getItems().stream()
              .allMatch(i -> i.getErrors() == null || i.getErrors().isEmpty()) ?
      "success" :
      "failure";

На заметку о том, что методы никогда не должны возвращать null наборов. Отсутствие элементов должно выражаться в возврате пустых коллекций. Это сделало бы ваш код намного проще:

return message.getItems().stream().allMatch(i -> i.getErrors().isEmpty()) ?
      "success" :
      "failure";
0
ответ дан Federico Peralta Schaffner 19 January 2019 в 15:52
поделиться

Вы можете использовать flatMap для поиска списка в списке. Я лично считаю, что List не должно никогда быть null, вместо этого это должен быть пустой список. Если это гарантия, то код может быть таким:

boolean hasError = message.getItems().stream()
    .flatMap(t -> t.getErrors().stream())
    .findAny()
    .isPresent();
return (hasError ? "success" : "failure");

В противном случае код становится немного длиннее:

boolean hasError = Optional.ofNullable(message.getItems()).orElse(List.of()).stream()
    .flatMap(t -> Optional.ofNullable(t.getErrors()).orElse(List.of()).stream())
    .findAny()
    .isPresent();
return (hasError ? "success" : "failure");

Обратите внимание, что я мог бы также использовать .count() > 0 вместо из .findAny().isPresent(). Но недостаток первого состоит в том, что он повторяется по всем ошибкам, в то время как последний замыкает накоротко, если обнаружена какая-либо ошибка.

0
ответ дан MC Emperor 19 January 2019 в 15:52
поделиться

Вы можете использовать anyMatch для итеративного кода как:

Optional<List<Item>> optionalItemList = Optional.ofNullable(message.getItems());
if (optionalItemList.isPresent())
    if (optionalItemList.get().stream()
            .map(item -> Optional.ofNullable((item.getErrors())))
            .filter(Optional::isPresent)
            .anyMatch(optionalErrorList -> !optionalErrorList.get().isEmpty())) {
        return "failure";
    }
return "success";

или еще более упростить его как:

return Optional.ofNullable(message.getItems())
        .filter(a -> a.stream()
                .map(item -> Optional.ofNullable((item.getErrors())))
                .filter(Optional::isPresent)
                .anyMatch(optionalErrorList -> !optionalErrorList.get().isEmpty()))
        .map(a -> "failure")
        .orElse("success");
0
ответ дан Naman 19 January 2019 в 15:52
поделиться

Для меня вы сделали это слишком сложным. Вот гораздо более простой способ сделать это. Убедитесь, что ваш метод getItems() возвращает пустой список, если нет элементов для возврата, чтобы вы могли обойтись без дополнительных нулевых проверок, как указано выше. Этот подход менее подвержен ошибкам и приводит к более читаемому коду. Если вы можете сделать то же самое для метода getErrors, описанного выше, вы можете просто отказаться от filter(Objects::nonNull), и это еще больше упростит конвейер обработки потока.

String errorPresent = message.getItems().stream()
    .map(Item::getErrors).filter(Objects::nonNull)
    .map(List::size).filter(s -> s > 0)
    .findAny().map(ignored -> "failure")
    .orElse("success");

В качестве альтернативы вы можете использовать троичный оператор, чтобы сделать это.

String errorPresent = message.getItems().stream()
    .map(Item::getErrors)
    .filter(Objects::nonNull)
    .anyMatch(e -> !e.isEmpty()) ? "failure" : "success";
0
ответ дан Ravindra Ranwala 19 January 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: