Java 8代码优化-删除if语句

问题描述 投票:1回答:2

我正在从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做一些魔术,但最终我得到了这个,我认为它可以做得更好,更简单。你可以帮帮我吗?也许这段代码不错,我不需要更改任何内容?这个问题更多的是关于干净的代码。

java java-8 functional-programming optional
2个回答
1
投票

您可以使此方法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);

0
投票

您可以将代码更改为如下形式:

  private List<Whiskey> getWhiskeyFromCountry(String origin) {
        return bottles.stream()
                .filter(b -> b.getOrigin().equals(origin))
                .collect(Collectors.toList());
    }

    private void getAll(RoutingContext routingContext) {
        String origin = routingContext.request().params().get("filter");
        List<Whiskey> result = getWhiskeyFromCountry(origin);

        routingContext.response()
                .putHeader("content-type", "application/json; charset=utf-8")
                .end(Json.encodePrettily((origin != null) ? result : bottles));
    }
© www.soinside.com 2019 - 2024. All rights reserved.