Вы можете перебрать индексы списка и найти те группы, которые равны, а затем поменять местами те, которые имеют ровно два элемента:
List<SiteDTO> sites = Arrays.asList(new SiteDTO(1L, "1"), new SiteDTO(2L, "2"), new SiteDTO(3L, "1"));
Map<String, List<Integer>> groups = IntStream.range(0, sites.size()).boxed().collect(groupingBy(o -> sites.get(o).getName()));
for (List<Integer> positions : groups.values()) {
if (positions.size() == 2)
Collections.swap(sites, positions.get(0), positions.get(1));
}
System.out.println(sites);
Вывод
[SiteDTO{id=3, name='1'}, SiteDTO{id=2, name='2'}, SiteDTO{id=1, name='1'}]
Примечание: Это работает в том случае, если у вас есть несколько групп для обмена.