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