最近来了新公司,主要用到了ElasitcSearch,大家都知道在底层查询代码中往往需要判断传入某个参数是否为空来判断设置查询,例如下方代码:

BoolQueryBuilder query = QueryBuilders.boolQuery();
if (param.getMusicId() != null) {
query.must(QueryBuilders.termQuery("musicId", keyword));
}
if (param.getMusicName() != null) {
query.must(QueryBuilders.matchQuery("musicName", keyword));
}
if (param.getTags() != null) {
query.must(QueryBuilders.termsQuery("tag", tags));
}
//..... 就这样N多if

以上情况一出现后,就导致了下次其他通知开发相关功能的时候,可能不符合他要求,他就会重新拷贝一份,然后再增加或者删除冗余一份出来满足自己需求,久而久之就 臃肿 了起来

于是乎我想到了学习的设计模式 策略模式 又想到了 Java8 Function ,当Function仅支持一个入参,于是我搜了下还有个BiFunction支持两个入参,

我打算将字段定义为策略Key,值就是Function,将查询构建代码抽离主逻辑,不多BB,直接上代码:

private static Map<MusicFieldEnum, BiFunction<BoolQueryBuilder, Object, QueryBuilder>> fieldQueryFunMap;

static {
fieldQueryFunMap = new HashMap<>();
fieldQueryFunMap.put(SHEET, (builder, value) -> builder.filter(QueryBuilders.termsQuery(SHEET.getCode(), value)));
fieldQueryFunMap.put(STATUS, (builder, value) -> builder.filter(QueryBuilders.termQuery(STATUS.getCode(), value)));
fieldQueryFunMap.put(MUSIC_ID, (builder, value) -> builder.filter(QueryBuilders.termsQuery(MUSIC_ID.getCode(), value)));
fieldQueryFunMap.put(SYS_TAG, (builder, value) -> builder.filter(QueryBuilders.nestedQuery(SYS_TAG.getCode(),QueryBuilders.termsQuery(SYS_TAG_ID.getCode(), value), ScoreMode.None)));
} public BoolQueryBuilder getQuery(Param param){
if (CollectionUtils.isEmpty(param.getSheetId())) {
fieldQueryFunMap.get(SHEET).apply(query, param.getSheetId());
}
if (CollectionUtils.isEmpty(param.getTags())) {
fieldQueryFunMap.get(SYS_TAG).apply(query, param.getTags());
}
if (param.getStatus() == ElasticsearchMusicStatuEnum.PUBLISH) {
fieldQueryFunMap.get(STATUS).apply(query, StatusEnum.PUBLISH_SUCCESS.code);
}
}

虽然代码量增加了点点,但我所想要达到的目的就是将字段的查询方式建立一个围栏,达到规范和便于重用。

使用Java8 的Function将查询构建代码单独抽离出来搭配策略模式,便于统一修改,也可以灵活装配,如有做的不当的地方大佬请赐教。

Java8 BiFunction 简单用用的更多相关文章

  1. Java8内置的函数式编程接口应用场景和方式

    首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...

  2. loadrunner 的Administration Page页面设置

    工作中用到Loadrunner不是很多,能够简单用用,深入的知识还得靠自己空余时自学.对于loadrunner 的Administration Page页面设置,我的理解是给自己设置各种障碍,然后一个 ...

  3. javascript组件化(转)

    javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...

  4. (转)javascript组件开发方式

    作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...

  5. ssh优缺点

    面试归来 技术面试官叫我谈谈 ssh优缺点 平时用起来倒是挺顺手..但是从来没有系统的总结过..导致很多点会都没有说出来.. 这次我认真总结了一下... 常说的好处 开源 常说的坏处 配置文件过大我就 ...

  6. [转]nodejs日期时间插件moment.js

    本文转自:https://blog.csdn.net/dreamer2020/article/details/52278478 问题来源js自带的日期Date可以满足一些基本的需求,例如格式化.时间戳 ...

  7. 带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)

    上半节已经下载好了Zookeeper,以及新建了两个应用provider和consumer,这一节我们就结合dubbo来测试一下分布式可不可以用. 现在就来简单用一下,注意:这里只是涉及最简单的部分, ...

  8. 前端js面向对象编程以及封装组件的思想

    demo-richbase 用来演示怎么使用richbase来制作组件的例子 作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力 ...

  9. 个人对JS原型链的一些理解(prototype、__proto__)

    前言 在我一开始学习java web的时候,对JS就一直抱着一种只是简单用用的心态,于是并没有一步一步地去学习,当时认为用法与java类似,但是在实际web项目中使用时却比较麻烦,便直接粗略了解后开始 ...

随机推荐

  1. Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇

    目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...

  2. 渗透技巧——如何逃逸Linux的受限制shell执行任意命令

    导语:本文介绍了如何在受限制的shell中执行任意命令,实现交互.其相应的利用场景是说当我们通过一些手段拿到当前Linux机器的shell时,由于当前shell的限制,很多命令不能执行,导致后续的渗透 ...

  3. 使用LCX进行内网端口转发

    Lcx.exe是一个端口转发工具,相当于把目标服务器A上的3389端口转发到具有外网ip地址的B机上(即我们自己的主机或是已经控制的主机),这样链接B机的3389端口就相当于链接A机的3389端口了, ...

  4. Vue UI lib missing vue bug

    Vue UI lib missing vue bug Error Uncaught TypeError: Cannot read property 'prototype' of undefined a ...

  5. Next.js 10

    Next.js 10 October 27th 2020 https://nextjs.org/blog/next-10 refs xgqfrms 2012-2020 www.cnblogs.com ...

  6. 联合登录 & OAuth 2.0 & OpenID

    联合登录 & OAuth 2.0 & OpenID 第三方联合登录一般可以降低网站的获客成本,所以一般的网站都会做一些联合登录,常用的就是QQ.微信.微博; https://www.z ...

  7. STAR 法则

    STAR 法则 STAR: Situation, Task, Action, Result 一. 什么是 STAR 法则? STAR法则是情境(situation).任务(task).行动(actio ...

  8. calendar merge date

    calendar merge date componentDidMount () { const { monthDays, // monthDates, } = this.props; const d ...

  9. React Hooks & Context API

    React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...

  10. input change only trigger once bug

    input change only trigger once bug clear first https://stackoverflow.com/a/11280934/5934465 upload E ...