Оптимизация кода Java 8 - удалить операторы if - PullRequest
0 голосов
/ 19 октября 2019

Я изучаю некоторые приемы из 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, но в конце концов я получил это, и я думаю, что это можно сделать лучше и проще. Не могли бы вы помочь мне? Или, может быть, этот код хорош, и мне не нужно ничего менять? Этот вопрос больше о чистом коде.

1 Ответ

2 голосов
/ 19 октября 2019

Вы можете сделать этот метод getWhiskeyFromCountry, чтобы принимать Optional<String> в качестве параметра

private List<Whiskey> getWhiskeyFromCountry(Optional<String> origin)

, а затем, если Optional пуст, возвращать пустой список или список возврата на основе filter, если пользователь вводит неверноorigin все равно вы получите пустой список

return origin.map(o->bottles.stream()
            .filter(b -> b.getOrigin().equals(o))
            .collect(Collectors.toList())).orElse(Collections.EMPTY_LIST);

Или в вышеприведенном коде вы можете сделать небольшую настройку для возврата List для этого метода getWhiskeyFromCountry

 private List<Whiskey> getWhiskeyFromCountry(String origin) {

    return bottles.stream()
            .filter(b -> b.getOrigin().equals(origin))
            .collect(Collectors.toList());
  }

Ив основном методе использовать Optional.map

Optional<String> origin = Optional.ofNullable(routingContext.request().params().get("filter"));
List<Whiskey> result = origin.map(o->getWhiskeyFromCountry(o))
                             .orElse(bottles);
...