Your proposed change to countMatches makes sense and I have applied it. Your proposed addition of exists is more troublesome. I agree that it will halve the average time to retrieve the result. But it does widen the public API. I think overall it probably is justified.
Would you like to create a patch for the exists and a suitable test case? Stephen From: "Peter Koßek" <[EMAIL PROTECTED]> 1. I recommend to change the code of the new method CollectionUtils#countMatches. It unnecessarily creates an ArrayList and adds elements from the input collection to it. public static int countMatches(Collection inputCollection, Predicate predicate) { int count = 0; if (inputCollection != null && predicate != null) { for (Iterator iter = inputCollection.iterator(); iter.hasNext();) { Object item = iter.next(); if (predicate.evaluate(item)) { count++; } } } return count; } 2. Furthermore, I suggest to introduce a new method CollectionUtils#exists, which tells the caller whether at least one element of a collection fulfills a given predicate. I suggest this because it would cost twice the time to compute #exists with the help of #countMatches. /** Answers true if a predicate is true for at least one element of a collection * @return whether at least one element of the collection matches the * predicate or false if none could be found */ public static boolean exists(Collection collection, Predicate predicate) { if (collection != null && predicate != null) { for (Iterator iter = collection.iterator(); iter.hasNext();) { Object item = iter.next(); if (predicate.evaluate(item)) { return true; } } } return false; } To illustrate this, I have programmed a small benchmark test which compares 4 different kinds of #exists - using #select over the momentary implementation of #countMatches - using the recommended implementation of #countMatches - using the suggested implementation of #exists - using a traditional solution without the flexibility of predicates The test output is shown at the bottom of this mail. Greetings Peter Koßek ---------------------- Tests with different #exist methods to iterate through a class collection using predicate #isInterface The test will be tried out 10000 times, the size of the collection is 1000. The test machine is a Pentium like processor with 800 MHz on W2K with JDK 1.3.1_06. To execute aClass.isInterface() 10000000 times, this processor needs 1572 milliseconds. A - The element fulfilling the predicate is at the beginning of the collection. A-1 Testing the existence of a predicate using 'CollectionUtils.select()'. size 1000 difference 2974 A-2 Testing the existence of a predicate using 'ExperimentalCollectionUtils.countHits()'. size 1000 difference 2824 A-3 Testing the existence of a predicate using 'ExperimentalCollectionUtils.exists()'. size 1000 difference 10 A-4 Testing the existence of a predicate in the traditional way. size 1000 difference 10 B - The element fulfilling the predicate is before the middle of the collection. B-1 Testing the existence of a predicate using 'CollectionUtils.select()'. size 1000 difference 2954 B-2 Testing the existence of a predicate using 'ExperimentalCollectionUtils.countHits()'. size 1000 difference 2814 B-3 Testing the existence of a predicate using 'ExperimentalCollectionUtils.exists()'. size 1000 difference 1382 B-4 Testing the existence of a predicate in the traditional way. size 1000 difference 1321 C - The element fulfilling the predicate is at the end of the collection. C-1 Testing the existence of a predicate using 'CollectionUtils.select()'. size 1000 difference 2984 C-2 Testing the existence of a predicate using 'ExperimentalCollectionUtils.countHits()'. size 1000 difference 2754 C-3 Testing the existence of a predicate using 'ExperimentalCollectionUtils.exists()'. size 1000 difference 2764 C-4 Testing the existence of a predicate in the traditional way. size 1000 difference 2643 ____________________________________________________________________________ __ Werden Sie kreativ! Bei WEB.DE FreeMail hei?t es jetzt nicht nur schreiben, sondern auch gestalten. http://freemail.web.de/features/?mc=021142 -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>