Дело в том, что foreach, например, не позволяет изменять коллекцию, по которой итерирует, а иногда это надо.
С другой стороны, если в коде семантически коллекция предметов, то гораздо более понятным будет использование foreach и работа внутри цикла с предметом, а не с элементом массива.
Так что приводить всё к одному или к другому тоже не вариант
ну конечно, лучше писать так, чтобы было очевидно использование одного перед другим. то есть правильно, там, где создается массив, и меняется порядок элементов, там да. но если подумать, то все можно изначально писать так, чтобы не требовалось создавать отдельных массивов. и я бы и это влил в требования к стилю. типа просто bad practice, как хочешь так и вертись. хочешь slim, хочешь read only slim, хочешь value slim, только не делай копию данные там, где нужно просто поменять местами два элемента. я все равно предпочитаю читальный код, по сравнению с оптимизированным. и желательно, чтобы автор мог внятно обьяснить необходимость создания Array/ArrayList/[] в каждом конкретном случае, по сравнению с слайсами и досупом по слим акксесорам, с комментариями