小白求助: Java 有什么方法可以做复杂条件过滤 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
slomo
V2EX    程序员

小白求助: Java 有什么方法可以做复杂条件过滤

  •  1
     
  •   slomo 2022-01-21 11:51:15 +08:00 3823 次点击
    这是一个创建于 1358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说下一些条件的情况

    • 条件是可以配置的
    • 逻辑关系包含与、或、非
    • 计算关系包含 = 、>、<、>=、<= 还有 in
      • 当然这里的'in'可以用多个'或'去替换

    总的来说就是需要实现类似 sql 的效果。但是用 java 实现。 条件里的字段是可以控制住的。

    举例: 创建了一个抽奖活动,这个抽奖的参与条件如下:

    1. 会员和普通用户均能参加
    2. 会员需要积分参加
    3. 普通用户需要交钱参加

    如上几个条件都是通过创建活动时管理员的配置来规定的,他也可以设置会员和普通用户都交钱参加,或者直接免费参与。或者普通用户直接不能参与...

    而我要做的工作就是用户带着他的身份和其他必要信息参与抽奖时,去判断他是否有资格。这个判断条件这里该怎么存储和实现比较好呢?

    求解。

    ps:最好还能考虑到布尔值的短路情况和前端展示

    pps:如果方案真的不错,有偿

    20 条回复    2022-01-25 17:09:02 +08:00
    smartbot
        1
    smartbot  
       2022-01-21 11:52:26 +08:00   4
    关键词: 规则引擎
    wwwz
        2
    wwwz  
       2022-01-21 11:59:32 +08:00
    储存 OGNL 表达式,前端展示和 OGNL 互转
    ic2y
        3
    ic2y  
       2022-01-21 12:01:12 +08:00
    aviator
    storyxc
        4
    storyxc  
       2022-01-21 12:17:27 +08:00
    一楼+1 ,一般这种复杂场景+经常变更的规则用规则引擎比较好
    Tsingchengliu
        5
    Tsingchengliu  
       2022-01-21 13:58:45 +08:00
    aviator 或者 groovy ,套个管理端就可以做简单的规则引擎
    monetto
        6
    monetto  
       2022-01-21 14:02:58 +08:00
    1. 规则引擎
    2. 责任链模式 进行 链式判断
    312ybj
        7
    312ybj  
       2022-01-21 14:07:58 +08:00
    规则引擎 drools
    isJoey
        8
    isJoey  
       2022-01-21 14:25:23 +08:00
    国产开源 iteflow 应该能满足
    CoooooolFrog
        9
    CoooooolFrog  
       2022-01-21 16:08:57 +08:00
    推荐 aviator ,非常好用( aviator 的作者就坐在我背后 )
    cheng6563
        10
    cheng6563  
       2022-01-21 16:14:13 +08:00
    直接配置 SQL WHERE 完事,更进一步就是直接写 Js 或者 Groovy 脚本。
    用规则引擎也行。

    别想着搞个什么责任链或者流程引擎什么的然后全部图形化配置。
    andy2415
        11
    andy2415  
       2022-01-21 16:32:05 +08:00
    简单的规则用 Predicate 就够用了吧
    themostlazyman
        12
    themostlazyman  
       2022-01-21 16:38:42 +08:00   1
    JDK8 list.stream().filter
    lele140
        13
    lele140  
       2022-01-21 16:45:03 +08:00
    aviator +1
    beitayongguo
        14
    beitayongguo  
       2022-01-21 16:45:10 +08:00
    都在说规则引擎~ 其实表达式引擎也可以的吧
    wolfie
        15
    wolfie  
       2022-01-21 16:50:10 +08:00
    spring 的 spel 也可以。

    cn.hutool.extra.expression.ExpressionEngine 看实现类。
    zxjunz
        16
    zxjunz  
       2022-01-21 17:18:46 +08:00
    @CoooooolFrog #9 牛逼
    fanshaohua
        17
    fanshaohua  
       2022-01-21 23:28:38 +08:00
    c# 有 LINQ ,Java 对应的应该是 Stream

    https://putridparrot.com/blog/javas-linq-equivalent-streams/
    RuLaiFo
        18
    RuLaiFo  
       2022-01-22 09:52:05 +08:00 via Android
    是单表还是多表查询。
    cryboy007
        19
    cryboy007  
       2022-01-22 11:17:05 +08:00
    涨知识了,我们项目都是自己写用 if else 拼接.真的是又臭又长
    slomo
        20
    slomo  
    OP
       2022-01-25 17:09:02 +08:00 via Android
    @CoooooolFrog 厉害了大佬,能不能请问下表达式跟对象转换有什么好的方法嘛,单独表达式前端不好展示
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1024 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 18:37 PVG 02:37 LAX 11:37 JFK 14:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86