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);
我正在从 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);