Самым простым решением будет цикл, поскольку формально правильное потоковое решение, которое также будет работать параллельно, требует нетривиальных (по сравнению с остальными) функций слияния:
Map<String,Integer> nameMap = mySet.stream()
.sorted(myComparator)
.collect(HashMap::new, (m, s) -> m.put(s.getName(), m.size()),
(m1, m2) -> {
int offset = m1.size();
m2.forEach((k, v) -> m1.put(k, v + offset));
});
Сравнение с циклом / коллекциейоперации:
List<MyObject> ordered = new ArrayList<>(mySet);
ordered.sort(myComparator);
Map<String, Integer> result = new HashMap<>();
for(MyObject o: ordered) result.put(o.getName(), result.size());
Оба решения предполагают уникальные элементы (поскольку может быть только одна позиция).Легко изменить цикл для выявления нарушений:
for(MyObject o: ordered)
if(result.putIfAbsent(o.getName(), result.size()) != null)
throw new IllegalStateException("duplicate " + o.getName());