在Java中使用Predicate的CollectionUtils

12

我有一个 List<Object>,我想返回第一个符合谓词的值。我发现我可以使用 CollectionUtils.find(collection,predicate) (Apache commons)。假设 Object 包含一个名为 value 的整数变量,如何在谓词中指定该值可以是 1,2,3,4,5,并且舍弃不匹配的值。是否可以进行“包含”操作。

另外,由于没有使用 java 8,因此无法使用 stream。

3个回答

33

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

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<MyObject> 是相同的。

我认为 OP 想要过滤列表(丢弃不匹配的对象)。而你只是找到第一个与谓词匹配的对象。 - Dici
4
值得注意的是,通用的“Predicate”仅存在于版本4中。 - blgt
1
谓词应该是什么?因为我得到了“谓词类型不是泛型;它不能用参数<MyObject>进行参数化”的错误。 - Rory Lester
1
所以你需要将“Object”强制转换为其实际类型,即包含“value”变量的类型。 - Jean Logeart
是的,我尝试过了,但仍然不起作用,出现了相同的错误。 - Rory Lester
显示剩余3条评论

5
在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表达式。

0
你可以使用 Collections.removeIf(我假设你正在使用 JDK 8)。你也可以使用 Stream :
list = list.stream().filter(predicate).collect(Collectors.toList());

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


很不幸,我不是,这就是为什么我选择使用CollectionUtils的原因。 - Rory Lester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接