@Override public void setMembers(Collection<Entity> mm, Predicate<Entity> filter) { synchronized (members) { log.debug("Group {} members set explicitly to {} (of which some possibly filtered)", this, members); List<Entity> mmo = new ArrayList<Entity>(getMembers()); for (Entity m: mmo) { if (!(mm.contains(m) && (filter==null || filter.apply(m)))) // remove, unless already present, being set, and not filtered out removeMember(m); } for (Entity m: mm) { if ((!mmo.contains(m)) && (filter==null || filter.apply(m))) { // add if not alrady contained, and not filtered out addMember(m); } } getManagementSupport().getEntityChangeListener().onMembersChanged(); } }