As reminded by @Reto Höhener like said in the ref of my question
to keep original insertion order index positions, one can mirror the keys in the KeySet in something like an ArrayList, keep it in sync with updates to the HashMap and use it for finding position
for a List:
Filling an ordered ConcurrentMap like ConcurrentSkipListMap with a list of positions as values should do the trick.
Cafeine could also do the job but I still need to look at it.
final int[] index = {0};
Stream<ComplexObject> t = someListOfComplexObject.stream();
ConcurrentMap<String, List<Integer>> m =
t.collect(Collectors.groupingBy(
e -> e.getComplexStringElem(),
Collectors.mapping(
e -> index[0]++,
Collectors.toList()
),
ConcurrentSkipListMap::new));