lamda表达式之---orElseGet

本文探讨了Java Stream API中Lambda表达式orElseGet的使用,通过对比未使用orElseGet的代码,展示了如何优化空值检查,提高代码效率。同时,提供了一个小测试案例来进一步说明其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

未使用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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值