Property Collector
Thursday, 9. February 2006, 20:52:14
From time to time I have seen code iterating over a collection of JavaBeans and creating a new collection out of that, containing values of a specific property of the original collection's elements. This is usually implemented like this:
[COLOR=#000000]List propList = [/COLOR][COLOR=#7f0055][b]new [/b][/COLOR][COLOR=#000000]ArrayList[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#000000]Iterator iter = collection.iterator[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#7f0055][b]while [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]iter.hasNext[/COLOR][COLOR=#000000]()) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]MyJavaBean mjb = [/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]MyJavaBean[/COLOR][COLOR=#000000]) [/COLOR][COLOR=#000000]iter.next[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]propList.add[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]mjb.getMyProperty[/COLOR][COLOR=#000000]())[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#000000]}[/COLOR]
In Java 5 this can be reduced to:
[COLOR=#000000]List propList = [/COLOR][COLOR=#7f0055][b]new [/b][/COLOR][COLOR=#000000]ArrayList[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#7f0055][b]for [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]MyJavaBean mjb: collection[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]propList.add[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]mjb.getMyProperty[/COLOR][COLOR=#000000]())[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#000000]}[/COLOR]
Using PropertyCollector this can be further reduced to:
[COLOR=#000000]List propList = PropertyCollector.collectProperty[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]collection, [/COLOR][COLOR=#2a00ff]"myProperty"[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]
And here's the code for PropertyCollector:
[COLOR=#3f7f5f]/*[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#3f7f5f]* Created by Behrang Saeedzadeh[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#3f7f5f]* on Jan 31, 2006 @ 7:50:15 PM[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#3f7f5f]*/[/COLOR]<br />
[COLOR=#7f0055][b]package [/b][/COLOR][COLOR=#000000]org.behrang.common.collections;[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.util.List;[/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.util.Collection;[/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.util.ArrayList;[/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.util.Iterator;[/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.lang.reflect.Method;[/COLOR]<br />
[COLOR=#7f0055][b]import [/b][/COLOR][COLOR=#000000]java.lang.reflect.InvocationTargetException;[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#7f0055][b]public class [/b][/COLOR][COLOR=#000000]PropertyCollector [/COLOR][COLOR=#000000]{[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]public static [/b][/COLOR][COLOR=#000000]List collectProperties[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]Collection coll, String property[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]List propList = [/COLOR][COLOR=#7f0055][b]new [/b][/COLOR][COLOR=#000000]ArrayList[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]if [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]coll.isEmpty[/COLOR][COLOR=#000000]()) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]return [/b][/COLOR][COLOR=#000000]propList;[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]}[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]Object o = coll.iterator[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000].next[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]Class c = o.getClass[/COLOR][COLOR=#000000]()[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]Method m;[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]try [/b][/COLOR][COLOR=#000000]{[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]m = c.getDeclaredMethod[/COLOR][COLOR=#000000]([/COLOR][COLOR=#2a00ff]"get" [/COLOR][COLOR=#000000]+ property.substring[/COLOR][COLOR=#000000]([/COLOR][COLOR=#990000]0[/COLOR][COLOR=#000000], [/COLOR][COLOR=#990000]1[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000].toUpperCase[/COLOR][COLOR=#000000]() [/COLOR][COLOR=#000000]+ property.substring[/COLOR][COLOR=#000000]([/COLOR][COLOR=#990000]1[/COLOR][COLOR=#000000]))[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]} [/COLOR][COLOR=#7f0055][b]catch [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]NoSuchMethodException nsme[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]throw new [/b][/COLOR][COLOR=#000000]RuntimeException[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]nsme[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]}[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]try [/b][/COLOR][COLOR=#000000]{[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]for [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]Object element : coll[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]Object value = m.invoke[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]element[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]propList.add[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]value[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]}[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]} [/COLOR][COLOR=#7f0055][b]catch [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]IllegalAccessException iae[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]throw new [/b][/COLOR][COLOR=#000000]RuntimeException[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]iae[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]} [/COLOR][COLOR=#7f0055][b]catch [/b][/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]InvocationTargetException ite[/COLOR][COLOR=#000000]) {[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]throw new [/b][/COLOR][COLOR=#000000]RuntimeException[/COLOR][COLOR=#000000]([/COLOR][COLOR=#000000]ite[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000];[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]}[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#7f0055][b]return [/b][/COLOR][COLOR=#000000]propList;[/COLOR]<br />
[COLOR=#ffffff] [/COLOR][COLOR=#000000]}[/COLOR]<br />
[COLOR=#ffffff][/COLOR]<br />
[COLOR=#000000]}[/COLOR]
Is it that some tags are rendered inproperly?
By anonymous user, # 29. August 2006, 06:13:18