Нет! Измените структуру данных:
alter table t alter column [Transaction Date] date;
Вам повезло. Ваш формат будет правильно преобразован.
Затем, если вы хотите его в определенном формате, используйте вычисленный столбец:
alter table t add column transaction_date_mmddyyyy as
(replace(convert(varchar(10), [Transaction Date], 105), '-', '') )
Затем вы можете использовать дату - как дату , правильный способ его сохранения. Вы также можете получить формат презентации, который вы хотите.
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";
Вы можете использовать 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()
. Но недостаток первого состоит в том, что он повторяется по всем ошибкам, в то время как последний замыкает накоротко, если обнаружена какая-либо ошибка.
Вы можете использовать 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");
Для меня вы сделали это слишком сложным. Вот гораздо более простой способ сделать это. Убедитесь, что ваш метод 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";