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

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

  •  1
     
  •   slomo · 125 天前 · 1946 次点击
    这是一个创建于 125 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说下一些条件的情况

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

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

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

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

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

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

    求解。

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

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

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

    别想着搞个什么责任链或者流程引擎什么的然后全部图形化配置。
    andy2415
        11
    andy2415  
       125 天前
    简单的规则用 Predicate 就够用了吧
    themostlazyman
        12
    themostlazyman  
       125 天前   ❤️ 1
    JDK8 list.stream().filter
    lele140
        13
    lele140  
       125 天前
    aviator +1
    beitayongguo
        14
    beitayongguo  
       125 天前
    都在说规则引擎~ 其实表达式引擎也可以的吧
    wolfie
        15
    wolfie  
       125 天前
    spring 的 spel 也可以。

    cn.hutool.extra.expression.ExpressionEngine 看实现类。
    zxjunz
        16
    zxjunz  
       125 天前
    @CoooooolFrog #9 牛逼
    fanshaohua
        17
    fanshaohua  
       125 天前
    c# 有 LINQ ,Java 对应的应该是 Stream

    https://putridparrot.com/blog/javas-linq-equivalent-streams/
    RuLaiFo
        18
    RuLaiFo  
       124 天前 via Android
    是单表还是多表查询。
    cryboy007
        19
    cryboy007  
       124 天前
    涨知识了,我们项目都是自己写用 if else 拼接.真的是又臭又长
    slomo
        20
    slomo  
    OP
       121 天前 via Android
    @CoooooolFrog 厉害了大佬,能不能请问下表达式跟对象转换有什么好的方法嘛🥺,单独表达式前端不好展示
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1633 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.