【问题标题】:Apache commons PredicatedList with no IllegalArgumentException没有 IllegalArgumentException 的 Apache commons PredicatedList
【发布时间】:2010-10-24 04:28:46
【问题描述】:

如果您尝试添加的内容与谓词不匹配,Apache Commons Collections 中是否有办法拥有一个不会引发 IllegalArgumentException 的 PredicatedList(或类似的)?如果不匹配,它将忽略将项目添加到列表的请求。

例如,如果我这样做:

List predicatedList = ListUtils.predicatedList(new ArrayList(), PredicateUtils.notNullPredicate());
...
predicatedList.add(null); // throws an IllegalArgumentException 

我希望能够执行上述操作,但添加的 null 会被忽略,不会引发异常。

我无法从 JavaDocs 中确定 Commons Collections 是否支持这一点。如果可能的话,我想在不滚动我自己的代码的情况下这样做。

【问题讨论】:

  • 这不是谓词列表的要点,即您只想要列表中符合为其定义的条件的东西吗?为什么不直接使用普通列表?
  • 是的,它是谓词列表的点。但我希望它安静地忽略与谓词不匹配的事物,即进行谓词检查,但如果不匹配则不要抱怨。
  • 这在逻辑上与普通列表的行为相同,因为您不关心通知您元素未通过的谓词检查。
  • 不,不一样。您可以根据需要多次将 null 添加到标准 ArrayList。它们作为单独的元素进入。 “l.add(null); l.add(null); l.size();”也是如此。 l.size() 将返回 2。我不希望将空值添加到列表中,因此我想使用 PredicatedList 之类的东西。
  • 你完全错过了我想要表达的观点。我不希望列表中有空值,因此我查看了 PredicatedList。我不想在所有使用该列表的地方进行空检查。我想传递对可能添加到列表中的不同内容的引用。如果这些地方尝试添加 null,我想忽略该添加。但是我不想强迫到处去捕捉如果我使用 PredicatedList 会得到的 IllegalArgumentException。所以我想要 PredicatedList 的功能,但不会抛出异常,而不必自己动手!

标签: java api collections apache-commons


【解决方案1】:

刚刚找到CollectionUtils.filter。我可能可以修改我的代码来使用它,尽管首先悄悄地阻止添加到列表中仍然会很好。

    List l = new ArrayList();
    l.add("A");
    l.add(null);
    l.add("B");
    l.add(null);
    l.add("C");

    System.out.println(l); // Outputs [A, null, B, null, C]

    CollectionUtils.filter(l, PredicateUtils.notNullPredicate());

    System.out.println(l); // Outputs [A, B, C]

【讨论】:

    【解决方案2】:

    你不能吞下异常吗?

    try
    {
        predicatedList.add(null);
    }
    catch(IllegalArgumentException e)
    { 
        //ignore the exception
    }
    

    您可能需要编写一个包装器来为您执行此操作...

    【讨论】:

    • 谢谢。我想只用库代码来做。但我得出了同样的结论,即我必须编写自己的包装器来吞下异常。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2019-02-24
    • 2018-04-04
    • 1970-01-01
    • 2011-01-21
    • 2023-03-30
    • 2020-01-25
    相关资源
    最近更新 更多