代码片断:获取一个类集中所有元素的某个属性

怎么从 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;
	}

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.