未使用orElseGet之前的代码:
List<ResourceItem> resourceItems = response.getData();
if (CollectionUtils.isNotEmpty(resourceItems)) {
Map<Long, List<ResourceItem>> collect =
resourceItems.stream().map(e -> {
if (e.getScope() == null || e.getScope() == 600L || e.getScope() == 0L) {
e.setScope(600L);
}
return e;
}).collect(Collectors.groupingBy(ResourceItem::getScope));
// 当前城市 (优先使用当前城市所配置的广告,若是没有,使用全国的,全国的城cityId是600/0/null,)
List<ResourceItem> curCity = collect.get(cityId.longValue());
if (!ObjectUtils.isEmpty(curCity)) {
List<HouseExpertsAdsVO> curCityList = curCity.stream()
.map(e -> e.convert(HouseExpertsAdsVO.class))
.collect(Collectors.toList());
return curCityList.get(0);
}
// 全国
List<ResourceItem> nationwide = collect.get(600L);
if (!ObjectUtils.isEmpty(nationwide)) {
List<HouseExpertsAdsVO> nationwideList = nationwide.stream()
.map(e -> e.convert(HouseExpertsAdsVO.class))
.collect(Collectors.toList());
return nationwideList.get(0);
}
}
使用orElseGet之后:
List<ResourceItem> resourceItems = response.getData();
if (CollectionUtils.isNotEmpty(resourceItems)) {
List<HouseExpertsAdsVO> collect = response.getData().stream()
.map(e -> e.convert(HouseExpertsAdsVO.class, (x, y) -> x.setCityId(y.getScope() == null ? null : y.getScope().intValue())))
.collect(Collectors.toList());
//这个是过滤出来城市里面设置的广告
Optional<HouseExpertsAdsVO> first = collect.stream().filter(e -> cityId.equals(e.getCityId())).findFirst();
//若是first为null,则执行orElseGet的内容,获取全国设置的,若是全国的也为空,则orElse==null;
return first.orElseGet(() -> collect.stream()
.filter(e -> e.getCityId() == null || e.getCityId().equals(0) || e.getCityId().equals(600))
.findFirst()
.orElse(null));
}
orElseGet的一个小test:
@Test
public void testOrElse() {
//表达式:orElseGet和orElse
List<User> list = new ArrayList<>();
User user = new User(1, "22");
list.add(user);
list.add(new User(2, "ninin"));
Optional<User> first = list.stream().filter(e -> e.getId().equals(2)).findFirst();
User user1 = first.orElseGet(() -> list.stream().filter(e -> e.getId().equals(1)).findFirst().orElse(null));
User user2 = first.orElse(list.stream().filter(e -> e.getId().equals(1)).findFirst().orElse(null));
System.out.println(user1);
System.out.println(user2);
}