V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slomo
V2EX  ›  程序员

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

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

    先说下一些条件的情况

    • 条件是可以配置的
    • 逻辑关系包含与、或、非
    • 计算关系包含 = 、>、<、>=、<= 还有 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   ·   实用小工具   ·   3155 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:28 · PVG 20:28 · LAX 04:28 · JFK 07:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.