public static <T extends Identifiable & HasAddons> List<T> withAddons(List<T> entities, AddonsDAO dao) { Collection<UUID> ids = Collections2.transform(entities, new Function<T, UUID>() { @Override public UUID apply(final T entity) { return entity.getId(); } } ); if (ids.size() <= 0) { return entities; } List<AddonGroup> addons = dao.findAllAddonsForIds(new ArrayList(ids)); Map<UUID, List<AddonGroup>> addonsForEntity = Maps.newHashMap(); for (AddonGroup addon : addons) { if (!addonsForEntity.containsKey(addon.getEntityId())) { addonsForEntity.put(addon.getEntityId(), new ArrayList<AddonGroup>()); } addonsForEntity.get(addon.getEntityId()).add(addon); } for (T entity : entities) { if (addonsForEntity.containsKey(entity.getId())) { entity.setAddons(asMap(addonsForEntity.get(entity.getId()))); } } return entities; }