Как было написано в комментариях: вы можете объединить два Comparator
сначала по длине, затем по String
значению.
list.stream()
.sorted(Comparator
.comparing(String::length)
.thenComparing(String::compareTo))
.collect(Collectors.toList());
ОБНОВЛЕНИЕ
Как было написано Хольгером, есть некоторые проблемы с вышеуказанным подходом. Его можно переписать, как показано ниже:
list.stream()
.sorted(Comparator.comparing((String s) -> s.split("\\."),
Comparator
.comparing((String[] a) -> Integer.parseInt(a[0]))
.thenComparingInt((a) -> a.length > 1 ? Integer.parseInt(a[1]) : 0))
)
.collect(Collectors.toList());
Но это выглядит сложнее, и он делает более или менее то же самое, что было предложено VGR . Таким образом, в конце вы можете написать это так:
list.stream()
.sorted(Comparator.comparing(Runtime.Version::parse))
.collect(Collectors.toList());