Я изучаю некоторые приемы из Java 8. Я создал простой список:
private void createData() {
bottles.add(new Whiskey("Jack Daniels", "PL"));
bottles.add(new Whiskey("Balentains", "PL"));
bottles.add(new Whiskey("Balentains", "EN"));
bottles.add(new Whiskey("Balentains", "EN"));
bottles.add(new Whiskey("Balentains", "GR"));
bottles.add(new Whiskey("Balentains", "PL"));
bottles.add(new Whiskey("Balentains", "GR"));
}
И теперь я хотел бы получить элементы из этого списка несколькими способами. Если пользователь задает параметр origin
, я хочу отфильтровать этот список по origins
, но если он дал неправильный origin
, он должен получить пустой список, а когда он не даст параметр origin
, тогда он должен получить целоесписок.
У меня есть метод, который фильтрует элементы в списке:
private Optional<List<Whiskey>> getWhiskeyFromCountry(String origin) {
final List<Whiskey> whiskies = bottles.stream()
.filter(b -> b.getOrigin().equals(origin))
.collect(Collectors.toList());
return whiskies.isEmpty() ? Optional.empty() : Optional.of(whiskies);
}
А также основной метод, который получает параметр (или нет) и ответ с результатом:
private void getAll(RoutingContext routingContext) {
Optional<String> origin = Optional.ofNullable(routingContext.request().params().get("filter"));
List<Whiskey> result = getWhiskeyFromCountry(origin.orElse("")).orElse(Collections.EMPTY_LIST);
routingContext.response()
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodePrettily(origin.isPresent() ? result : bottles));
}
Проблема в том, что я по-прежнему использую statemant в последней строке и не хочу этого делать. Я хотел бы изменить этот код на понятный и функциональный. Я пытался творить магию с Optionals, но в конце концов я получил это, и я думаю, что это можно сделать лучше и проще. Не могли бы вы помочь мне? Или, может быть, этот код хорош, и мне не нужно ничего менять? Этот вопрос больше о чистом коде.