Сортировка списка по подстрокам в java stream по двум условиям

Есть стрим в котором на каком-то этапе стринги преобразуются в Object, получается вот такой лист:
[3-B, 4-A, 4-D] (цифра\делиметер\буква). Я его привожу к стрингу и сортирую. Цифры нужно сортировать по убыванию, если цифры совпадают, то буквы - по возрастанию кодов.
Чтобы доступиться к методам сравнения я привожу object в string.Но это не дает результата. Второе условие почему-то сравнивает не последние символы (как я ожидаю), а все слово. Все действия нужно сделать с помощью одного стрима. Что мне нужно исправить?

из [3-B, 4-A, 4-D] --нужно получить--> [ 4-A, 4-D, 3-B]

     List<String>list.stream() 
         ...
    .map(Object::toString)
    .sorted(Comparator.comparing(String::valueOf)
    .thenComparingInt(str -> Integer.parseInt((str.toString()).substring(2)))
    .reversed())
    .collect(Collectors.toList());

Ответы (2 шт):

Автор решения: kyt3

Раз обязательно Stream API - можно вот так:

List<String> list = new ArrayList<>();
    list.add("3-B");
    list.add("4-A");
    list.add("4-D");

    list = list.stream().sorted((o1, o2) -> {
        int code1 = Integer.parseInt(o1.substring(0, 1));
        int code2 = Integer.parseInt(o2.substring(0, 1));

        if (code2 - code1 != 0) {
            return code2 - code1;
        } else {
            char char1 = o1.charAt(2);
            char char2 = o2.charAt(2);

            return char1 - char2;
        }
    }).collect(Collectors.toList());

    System.out.println(list);
→ Ссылка
Автор решения: IFlex

Вроде бы нашел причину: компаратору нужно было явно указать типы подстрок.

    .sorted (Comparator.<String, String> comparing(s -> s.split("-")[0])
    .reversed()
    .thenComparingInt(s -> Integer.parseInt(s.split("-")[1])))
→ Ссылка