怎么从 List<Person> personList中取出 List<Long> idList ? 没有闭包语法的情况下,你只能写一个for循环,一个一个往里塞。。。
老写这种东西,会不胜期烦。 可以写个微型的框架,让你写更少更简洁的代码完成这种事情。
你会这样用:
List<Long> idList = MyCollectionUtils.extractProperty( personList, GetPersonIdPropCommand());
public static final class GetPersonIdPropCommand implements GetPropertyCommand<Person, Long> { ...... }
框架在这里:
/** * 从一个类集中抽取中每个元素的某个属性. 举例说明:{person1, person2} => {person1Id, person2Id} * * * @param objects * @param getPropCommand * @return */ public static <O, P> ArrayList<P> extractProperty(Collection<O> objects, GetPropertyCommand<O, P> getPropCommand) { ArrayList<P> resultList = new ArrayList<P>(); for (O object : objects) { if(object == null){ continue; } P property = getPropCommand.getProperty(object); resultList.add(property); } return resultList; }
public interface GetPropertyCommand<O, P> { P getProperty(O object); }
你可能还需要这样两个操作:
/** * 把一个类集变成map, key是元素的某个属性 <br/> * 举例说明:{person1, person2} => {<person1Id, person1>, <person2Id, person2>} <br/> * 如果某个对象为空或相应的属性为空,则该对象不会出现在返回结果中 <br/> * @param objects * @param getPropCommand * @return linked hash map, 以保证顺序与原来相同. */ public static <O, P> LinkedHashMap<P, O> collectionToPropMap( Collection<O> objects, GetPropertyCommand<O, P> getPropCommand) { LinkedHashMap<P, O> resultMap = new LinkedHashMap<P, O>(); for (O object : objects) { if(object == null){ continue; } P property = getPropCommand.getProperty(object); if(property == null){ continue; } resultMap.put(property, object); } return resultMap; } /** * 把一个类集变成map, key是元素的某个属性<br/> * 举例说明:{person1, person2, person3} => {<male, [person1]>, <female, [person2, person3]>} <br/> * 如果某个对象为空或相应的属性为空,则该对象不会出现在返回结果中 <br/> * 注意:这个方法不是线程安全的 <br/> * @param objects * @param getPropCommand * @return linked hash map, 以保证顺序与原来相同 */ public static <O, P> LinkedHashMap<P, List<O>> collectionToPropListMap( Collection<O> objects, GetPropertyCommand<O, P> getPropCommand) { LinkedHashMap<P, List<O>> resultMap = new LinkedHashMap<P, List<O>>(); for (O object : objects) { if(object == null){ continue; } P property = getPropCommand.getProperty(object); if(property == null){ continue; } List<O> thisPropList = resultMap.get(property); if(thisPropList == null){ thisPropList = new ArrayList<O>(); resultMap.put(property, thisPropList); } thisPropList.add(object); } return resultMap; }