前言

   java8开始的lambda接触到现在差不多三年了,fp用起来真的是越用越舒服。最近做的一个项目,需要对excel内容做校验,这次尝试使用optionalCollectors.groupingBy来做,干掉那些让人看着就想吐的if...else

Collectors.groupingBy

//重复数据校验
        Map<DecorationFeatureRule, Long> result =
                list.stream().collect(
                        Collectors.groupingBy(e->new DecorationFeatureRule()
                                        .setChnl_cd(e.getChnl_cd())
                                        .setGeo_id(e.getGeo_id())
                                        .setStore_decorat_fetru(e.getStore_decorat_fetru())
                                        .setCeiling_decoration(e.getCeiling_decoration()).setAisle(e.getAisle()).setShelf(e.getShelf()).setHygiene(e.getHygiene())
                                ,Collectors.counting()
                        )
                );

        List<DecorationFeatureRule> collect = result.entrySet().stream().filter(e -> e.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());

        if(CollectionUtils.isNotEmpty(collect))
            throw new IllegalArgumentException("数据重复:"+collect.get(0).toString());

其实上面的语法还是再精简一些,不过为了方面debug和其他同事review,暂时保留目前的形态

Collection.removeIf

        if (null != entity.getUid()) {
               list.removeIf(e -> e.getUid().equals(entity.getUid()));
           }

Collection.removeIf 去除集合里的特殊数据,比stream.filter好用且直观。

@FunctionalInterface

    @FunctionalInterface
    public interface RuleQueryHandler<Q, T> {
        void buildQuery(LambdaQueryWrapper<T> lambda, Q queryDto);
    }
//省略若干行代码

    public QueryWrapper<T> buildQuery(Q queryDto, RuleQueryHandler<Q, T> ruleQueryHandler) {
        ruleQueryHandler.buildQuery(lambda, queryDto);
        return queryWrapper;

    }

@FunctionalInterface 配合范型,可以解决掉程序员最痛恨的无意义的重复性粘贴复制的工作量,实测在项目中,类似的功能模块,节约掉80%左右的代码量,并且由于抽象程度足够好,业务层只需要关注具体业务实现,lower level层的逻辑,完全封装,并且方便统一修改。

Optional

         //格式校验
         list.forEach(e -> {
 
             e.setCeiling_decoration(Optional.ofNullable(ceiling_decoration.get(e.getCeiling_decoration())).orElseThrow(() -> new IllegalArgumentException("天花板装修格式错误")));
             e.setAisle(Optional.ofNullable(aisle.get(e.getAisle())).orElseThrow(() -> new IllegalArgumentException("过道情况格式错误")));
             e.setShelf(Optional.ofNullable(shelf_quality.get(e.getShelf())).orElseThrow(() -> new IllegalArgumentException("货架质量格式错误")));
             e.setHygiene(Optional.ofNullable(hygiene.get(e.getHygiene())).orElseThrow(() -> new IllegalArgumentException("店内卫生情况格式错误")));
             e.setStore_decorat_fetru(Optional.ofNullable(decoration.get(e.getStore_decorat_fetru())).orElseThrow(() -> new IllegalArgumentException("门店装潢格式错误")));
             Optional.ofNullable(gdtDimChanlFromCache.get(e.getChnl_cd())).orElseThrow(() -> new IllegalArgumentException("渠道错误" + e.getChnl_cd()));
 
         });

我是对NPE无比厌倦和恐怖的人,但是为了程序的健壮,被迫写了太多的if...else来处理NPE,Optional真的是我的救星,太棒了!

其他

   再看lombok的代码风格:

@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@Log4j2
public class DecorationFeatureRule

有经验的程序员,自然知道这几行代码省了代码量。

   java历来为人诟病的一大缺点是代码过于冗长,曾经有前端同事吐槽:多次想转java,但是每次看到java那么垃圾那么长的代码,就立刻放弃,我还想留着发际线!
lomboklambda是降低java代码冗余的两大甜品。从事java的朋友,多多使用这两大利器,加上链式编程,配合范型,让你的代码质量更上一层楼。


Is this article useful to you? How about buy me a coffee ?