Почему sortBy сортирует иначе, чем потоковая сортировка в Kotlin? - PullRequest
1 голос
/ 29 января 2020

У меня есть список bean-компонентов, автоматически подключаемых интерфейсом в моем приложении с Kotlin и Spring-boot.

@Autowired
private var pages: List<Paging>

В пост-конструкции я сортирую bean-компоненты по простому имени класса

@PostConstruct
fun setUp(){
 pages.sortedBy { it.javaClass.simpleName }
 pages.forEach { log.info("{}", it::class.simpleName) }
}

Я вижу следующие результаты

page.month.Page19M@69cf9dd
page.month.Page04@43be5d62
page.month.Page03@5d34e3b3
page.month.Page13@151b7c03
page.month.Page16@6e71c9dc
page.month.Page17@7fe14f94
page.month.Page12@1f502e65
page.month.Page18@7d4d32a7
page.month.Page07@65c29c4c
page.month.Page06@5387e079
page.month.Page15@249dd7e6
page.month.Page11@56f13088
page.month.Page14@29ef49a1
page.month.Page10@76dc4e
page.month.Page09@c59b505
page.month.Page01@30c6e2e
page.month.Page02w@46bde78e
page.month.Page05@7500f8f0
page.month.Page08@7c5810e4

Бобы не сортируются по простому имени.

Но когда я использую стиль потока

pages.stream()
     .sorted { o1, o2 -> o1.javaClass.simpleName.compareTo(o2.javaClass.simpleName) }
     .forEach { i -> log.info("{}", i.javaClass.simpleName) }

Я вижу отсортированные результаты

page.month.Page01@30c6e2e
page.month.Page02w@46bde78e
page.month.Page03@5d34e3b3
page.month.Page04@43be5d62
page.month.Page05@7500f8f0
page.month.Page06@5387e079
page.month.Page07@65c29c4c
page.month.Page08@7c5810e4
page.month.Page09@c59b505
page.month.Page10@76dc4e
page.month.Page11@56f13088
page.month.Page12@1f502e65
page.month.Page13@151b7c03
page.month.Page14@29ef49a1
page.month.Page15@249dd7e6
page.month.Page16@6e71c9dc
page.month.Page17@7fe14f94
page.month.Page18@7d4d32a7
page.month.Page19M@69cf9dd

Я не понимаю, почему результаты отличаются. Я пытался использовать только класс с полем - работает нормально.

Что мне не хватает?

1 Ответ

1 голос
/ 29 января 2020

Метод sortedBy в стандартной библиотеке Kotlin не выполняет сортировку на месте. Вместо этого он возвращает новый отсортированный список .

В коде, которым вы поделились, вы сортируете список, используя pages.sortedBy{ ... }, но игнорируете результат этой операции. Таким образом, переменная pages остается неизменной, и вы получаете тот же список, что и раньше, когда вы повторяете ее, используя forEach.

Если вы вместо этого перебираете отсортированный список, вы получите желаемый результат:

val sortedPages = pages.sortedBy { page -> page.javaClass.simpleName }
sortedPages.forEach { sortedPage -> println(sortedPage) }

Вы можете сократить это далее, повторяя непосредственно по результату, возвращенному после сортировки списка:

pages.sortedBy { page -> page.javaClass.simpleName }
     .forEach { sortedPage -> println(sortedPage) }

Вы можете попробовать этот пример кода , чтобы проверить .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...