【问题标题】:CollectionUtils in java using predicateJava中的CollectionUtils使用谓词
【发布时间】:2014-10-25 17:24:39
【问题描述】:

我有一个List<Object>,我想返回它找到的第一个与谓词匹配的值。

我发现我可以使用CollectionUtils.find(collection,predicate)(Apache commons)。假设Object 包含一个名为:value 的整数变量,我如何在谓词中指定该值可以是1,2,3,4,5 并丢弃那些不匹配的值。是否可以做'包含'。

也没有使用 java 8 所以无法做流。

【问题讨论】:

    标签: java collections apache-commons apache-commons-collection


    【解决方案1】:

    返回列表中与给定谓词匹配的第一个元素:

    MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() {
        @Override
        public boolean evaluate(MyObject o) {
            return o.getValue() >= 1 && o.getValue() <= 5;
        }
    });
    

    过滤列表使其仅包含与谓词匹配的元素:

    CollectionUtils.filter(myList, new Predicate<MyObject>() {
        @Override
        public boolean evaluate(MyObject o) {
            return o.getValue() >= 1 && o.getValue() <= 5;
        }
    });
    

    你可以注意到Predicate&lt;MyObject&gt;是一样的。

    【讨论】:

    • 我认为 OP 想要过滤列表 (discard those that dont match)。您只是找到与谓词匹配的第一个对象。
    • 值得注意的是,通用Predicate 仅存在于版本 4 中
    • 不,你是对的,我使用 find 是因为我想返回它匹配的第一个值。谢谢
    • 谓词应该是什么?因为我得到类型谓词不是通用的;它不能用参数 . 参数化
    • 因此您需要将Object 转换为其实际类型,即包含value 变量的类型
    【解决方案2】:

    在 Java 8 中你可以编写

    Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny();
    

    在 Java 7 之前,最简单的解决方案是使用循环。

    Integer found = null;
    for(integer i : list)
       if (i >= 1 && i <= 5) {
            found = i;
            break;
       }
    

    由于 Java 7 不支持 lambda,这将是最干净、最快捷的方式。

    【讨论】:

      【解决方案3】:

      您可以使用Collections.removeIf(我假设您使用的是 JDK 8)。你也可以使用 Stream :

      list = list.stream().filter(predicate).collect(Collectors.toList());
      

      使用 Apache Commons Collections,您可以使用 CollectionUtils.filter

      【讨论】:

      • 很遗憾我不是,这就是我选择使用 CollectionUtils 的原因。
      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 2023-03-28
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多