【问题标题】:inline if inside List removeIfinline if inside 列表 removeIf
【发布时间】:2023-01-09 23:47:41
【问题描述】:

我有一个 List,它是 Criteria.list() 的结果。 Criteria 根据我选择的数据类型从不同的表中检索数据。

我有三个实体,它们通过 Hibernate 链接到表:

File.java

// fields
// getters and setters

Refund.java

// fields
private RefundState refundState;
// getters and setters

Quotation.java

// fields
private QuotationState quotationState;
// getters and setters

RefundQuotation 类扩展文件。因此,Refund 和 Quotation 有一些共同的字段,如果我想按类型独立获取所有文件,我可以。

但这会产生一个大问题。当我检索所有文件(退款和报价)时,我需要排除具有特定状态的报价和退款。报价单和退款的状态不同,所以我不能在 Criteria 中应用 Where condition

所以,我想我必须手动从结果列表中删除元素。我可以,通过list.removeIf(Predicate)

但是,由于 List 是多种类型的混合,我不能只是 cast,像这样:

list.removeIf(elem -> (((Refund) elem).getRefundState().getCode().equals("A")));

..因为,当elem 是报价单时它会中断。 所以,我想到了内联一个 if,就像这样:

list.removeIf(elem -> (elem instanceof Refund ? ((Refund) elem).getRefundState().getCode().equals("A")));

但它甚至不编译。它说缺少一个括号。

应该避免使用 forEach,因为 ResultSet 可能非常大。
不能更改任何课程。
应该避免制作两个不同的Criterias 并合并这两个列表。我在执行此 removeIf 的类中应用了我无法检索的其他 Where conditions

【问题讨论】:

    标签: java list hibernate arraylist lambda


    【解决方案1】:

    您使用的是没有 false 部分的三元表达式。如果您将 : false 添加到过滤器,它应该可以编译。但是,只要您的代码格式为A ? B : false,请将其替换为A && B。在这种情况下:

    elem -> elem instanceof Refund && ((Refund) elem).getRefundState().getCode().equals("A")
    

    如果您的 Java 足够新,您甚至可以将演员表移动到 instanceof

    elem -> elem instanceof Refund r && r.getRefundState().getCode().equals("A")
    

    【讨论】:

    • 会尽快检查是否有效。它编译,所以这值得赞成。我不知道错误的表达是强制性的..
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 2014-04-10
    • 2019-04-04
    • 1970-01-01
    • 2022-12-27
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多