为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白板的微信 2023-11-10 16:44:12
我正在学习 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));    }问题是我仍然在最后一行使用 if 语句,但我不想这样做。我想将此代码更改为清晰且实用。我尝试用Options做一些魔法,但最终我得到了这个,我认为它可以做得更好、更简单。你可以帮帮我吗?或者也许这段代码很好,我不需要改变任何东西?这个问题更多的是关于干净的代码。
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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

  }

并在 main 方法中使用Optional.map


Optional<String> origin = Optional.ofNullable(routingContext.request().params().get("filter"));

List<Whiskey> result = origin.map(o->getWhiskeyFromCountry(o))

                             .orElse(bottles);


查看完整回答
反对 回复 2023-11-10
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信