code: public static <T, K, S, X extends Collection<T>> X loadNToOne(X list,
  			Function<T, K> keyGetter,
  			Function<Collection<K>, Collection<S>> loader,
  			Function<S, K> loadedKeyGetter, BiConsumer<T, S> match) {
  		if (list == null || list.size() == 0)
  			return list;
  
  		Set<K> keys = toSet(list, keyGetter);
  		if (keys == null || keys.size() == 0)
  			return list;
  
  		Collection<S> subs = loader.apply(keys);
  		if (subs == null || subs.size() == 0)
  			return list;
  
  		HashMap<K, S> map = toHashMap(subs, loadedKeyGetter);
  		for (T item : list) {
  			K key = keyGetter.apply(item);
  			if (key == null)
  				continue;
  
  			S sub = map.get(key);
  			if (sub == null)
  				continue;
  			match.accept(item, sub);
  		}
  
  		return list;
  	}
docs: list为装有类型为T的对象的集合，称为集合一。用T对象中通过keyGetter获得的key值组成集合，调用
  loader，可以获得类型为S的对象集合，称为集合二。T和S的关系是N对1。把集合一中通过
  keyGetter获得的关键值与集合二中通过loadedKeyGetter获得关键值相同的T和S对象匹配，调用match。