前言
java8开始的lambda接触到现在差不多三年了,fp用起来真的是越用越舒服。最近做的一个项目,需要对excel内容做校验,这次尝试使用optional
和Collectors.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那么垃圾那么长的代码,就立刻放弃,我还想留着发际线!
lombok
和lambda
是降低java代码冗余的两大甜品。从事java的朋友,多多使用这两大利器,加上链式编程,配合范型,让你的代码质量更上一层楼。
Is this article useful to you? How about buy me a coffee ☕ ?