Я не уверен на 100%, но я полагаю, что причина такого поведения в зависимости от того, где вы сортируете свой поток, заключается в «синхронизации» данных, проходящих через поток.
Ваш foreach добавляет их в список слов, которые уже были найдены, но имейте в виду, что никакие данные не оцениваются, пока не будет вызван foreach.Это означает, что элементы добавляются в список только тогда, когда весь набор проходит через foreach.Ваш основной фильтр, который происходит до foreach, вероятно, увидит некоторое дублирование в результате попытки фильтрации по списку, которого на самом деле еще не существует.
Сортировка - это гаечный ключ в передачах всего этого, потому чтоон может задержать поток данных - нельзя гарантировать сортировку списка до тех пор, пока не будет просмотрен каждый элемент.Это не совсем завершающая операция, но она задерживает события до тех пор, пока не пройдут все элементы.Ленивая оценка - замечательная вещь, но она может быть сложной, и часто вам действительно нужно быть уверенным в том, что сортировка - это то, что вы хотите, прежде чем идти по этому пути.Пытаясь избежать, есть лучшие способы сделать это (у потока есть функция .distinct()
, которая сделает это для вас).
Я написал еще одну реализацию того, что вы пытаетесь сделать здесьэто дает следующий результат.
abel able bale bela elba
alger glare lager large regal
angel angle galen glean lange
caret carte cater crate trace
elan lane lean lena neal
evil levi live veil vile
Если вы хотите, я могу поделиться с вами этим - но у меня сложилось впечатление, что это для какой-то природы задания, и вы копаете, чтобы выяснить это на вашемсвоя.Хорошо, если это так.
Если вы хотите получить несколько советов или задать вопросы кому-либо, не стесняйтесь написать мне DM, и я буду рад помочь.После этого я отредактирую этот пост и опубликую код, который использовал для генерации блока выше.