Java 8 代码优化——去除if语句

Java 8 code optimization - remove if statements

我正在从 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 时,他应该得到空列表,而当他不提供 [=14] 时=] 参数,那么他应该得到整个列表。

我有一个方法可以过滤列表中的项目:

 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));
    }

问题是我仍然在最后一行使用 if statemant 并且我不想这样做。我想将此代码更改为清晰且实用。我试图用 Optionals 做一些魔术,但最后我得到了这个,我认为它可以做得更好、更简单。你可以帮帮我吗?或者也许这段代码很好,我不需要改变任何东西?这个问题更多的是关于干净的代码。

您可以使此方法 getWhiskeyFromCountry 接受 Optional<String> 作为参数

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

然后如果 Optional 为空 return 空列表或基于 filter 的 return 列表,如果用户输入错误 origin 仍然会得到空列表

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

或者在上面的代码中,您可以对 return 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);