CollectionUtils in java using predicate

48,492

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.

Share:
48,492
Rory Lester
Author by

Rory Lester

Updated on July 09, 2022

Comments

  • Rory Lester
    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 the Object contains a integer variable called : value , how do i specify in the predicate that the value can be 1,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
    Rory Lester over 9 years
    Unfortunately i'm not, which is why I chose to use CollectionUtils.
  • Dici
    Dici over 9 years
    I thought th OP wanted to filter the list (discard those that dont match). You are just finding the first object matching the predicate.
  • blgt
    blgt over 9 years
    Worth noting that the generic Predicate is only present in version 4
  • Rory Lester
    Rory Lester over 9 years
    No you are right, I am using the find because I want to return the first value that it matches. Thank you
  • Rory Lester
    Rory Lester over 9 years
    What should the predicate be? since i am getting The type Predicate is not generic; it cannot be parameterized with arguments <MyObject>.
  • Jean Logeart
    Jean Logeart over 9 years
    So you need to cast the Object to its actual type, the one that contains the value variable
  • Rory Lester
    Rory Lester over 9 years
    Yeah have tried that but still doesnt work, same error.
  • Rory Lester
    Rory Lester over 9 years
    It 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
    Jean Logeart over 9 years
    MyObject must be replaced by the type of the elements contains in your list, the type that contains the value variable.