CollectionUtils in java using predicate
Solution 1
To return the first element in the list which matches the given predicate:
MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() {
@Override
public boolean evaluate(MyObject o) {
return o.getValue() >= 1 && o.getValue() <= 5;
}
});
To filter the list so that it only contains elements matching the predicate:
CollectionUtils.filter(myList, new Predicate<MyObject>() {
@Override
public boolean evaluate(MyObject o) {
return o.getValue() >= 1 && o.getValue() <= 5;
}
});
You can notice that the Predicate<MyObject>
is the same.
Solution 2
In Java 8 you can write
Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny();
Before Java 7 the simplest solution is to use a loop.
Integer found = null;
for(integer i : list)
if (i >= 1 && i <= 5) {
found = i;
break;
}
This would be the cleanest and fastest way as Java 7 doesn't have support for lambdas.
Rory Lester
Updated on July 09, 2022Comments
-
Rory Lester almost 2 years
I have a
List<Object>
and I want to return the first value that it finds true which matches a predicate.I found that I can use
CollectionUtils.find(collection,predicate)
(Apache commons). Assuming that theObject
contains a integer variable called :value
, how do i specify in the predicate that the value can be1,2,3,4,5
and to discard those that dont match. Is it possible to do 'contains'.Also not using java 8 so unable to do stream.
-
Rory Lester over 9 yearsUnfortunately i'm not, which is why I chose to use CollectionUtils.
-
Dici over 9 yearsI thought th OP wanted to filter the list (
discard those that dont match
). You are just finding the first object matching the predicate. -
blgt over 9 yearsWorth noting that the generic
Predicate
is only present in version 4 -
Rory Lester over 9 yearsNo you are right, I am using the find because I want to return the first value that it matches. Thank you
-
Rory Lester over 9 yearsWhat should the predicate be? since i am getting The type Predicate is not generic; it cannot be parameterized with arguments <MyObject>.
-
Jean Logeart over 9 yearsSo you need to cast the
Object
to its actual type, the one that contains thevalue
variable -
Rory Lester over 9 yearsYeah have tried that but still doesnt work, same error.
-
Rory Lester over 9 yearsIt is the same issue : Predicate is not generic; it cannot be parameterized with arguments <MyObject> . Seems to be because I am using collections, it is using the predicate from that instead of the default predicate that does allow parameters. Is there a way around this without passing a parameter?
-
Jean Logeart over 9 years
MyObject
must be replaced by the type of the elements contains in your list, the type that contains thevalue
variable.